2009-06-05 3 views
0

Я две таблицы в базе данных MySql 5.1.34. При использовании SubSonic для генерации DAL отношение внешних ключей не получает сценарий, т.е. У меня нет объекта Parent.ChildCollection. Просмотр встроенного класса DAL Parent показывает следующее:SubSonic не генерирует таблицы внешнего ключа MySql

//no foreign key tables defined (0) 

Я пробовал SubSonic 2.1 и 2.2 и различные версии MySql 5. Я должен делать что-то неправильно процедурно - любая помощь будет очень признательна. При использовании MS-SQL это всегда работало «вне коробки».

TABLE `parent` (
    `ParentId` INT(11) NOT NULL AUTO_INCREMENT, 
    `SomeData` VARCHAR(25) DEFAULT NULL, 
    PRIMARY KEY (`ParentId`) 
) ENGINE=INNODB DEFAULT CHARSET=latin1; 

TABLE `child` (
    `ChildId` INT(11) NOT NULL AUTO_INCREMENT, 
    `ParentId` INT(11) NOT NULL, 
    `SomeData` VARCHAR(25) DEFAULT NULL, 
    PRIMARY KEY (`ChildId`), 
    KEY `FK_child` (`ParentId`), 
    CONSTRAINT `FK_child` FOREIGN KEY (`ParentId`) REFERENCES `parent` (`ParentId`) 
) ENGINE=INNODB DEFAULT CHARSET=latin1; 

ответ

2

Это работает для меня с этими настройками.

<add name="ProviderName" 
     type="SubSonic.MySqlInnoDBDataProvider, SubSonic" 
     connectionStringName="ConnectionString" 
     generateLazyLoads="true" 
     generatedNamespace="My.NameSpace" 
     generateRelatedTablesAsProperties="true" 
     tableBaseClass="ActiveRecord" /> 

Subsonic 2.2 и MySql 5.1.30. Вы также должны проверить, являются ли обе таблицы MyISAM.

И вы только создали этот внешний ключ? Тогда вполне вероятно, что Subsonic не заметит ваших изменений, потому что MySQL, похоже, кэширует Tableschema. См: http://code.google.com/p/subsonicproject/issues/detail?id=87

+0

Вот и все! Большое спасибо! Я искал конфигурацию до смерти, но не пришел через параметр generateRelatedTablesAsProperties. Очень полезно, ta. – 2009-06-05 16:28:25

+0

np, но generateRelatedTablesAsProperties = "true" не должно быть проблемой в первую очередь. В основном это превратит общедоступный метод «Product.GetOrders()» в публичное свойство », Product.Orders» –

0

Я не дозвуковой эксперт, но мне интересно, если там может быть техническое нарушение одного правила, в вашем синтаксисе, что, возможно, путает дозвуковой: по MySQL's reference,

Если в CONSTRAINT symbol , значение символа должно быть уникальным в базе данных.

Вы именовании как CONSTRAINT и KEY индекс FK_Child - интуитивно, что имеет смысл, и нет сомнений, MySQL и InnoDB счастливы с ним, но, может быть, дозвуковой-х разборе, что ограничение по-разному и более ограничительно. Что произойдет, если вы переименуете ограничение, чтобы избежать технического «конфликта» имен между ним и ключевым индексом?

+0

Алекс, большое спасибо за ваш быстрый ответ. Я не думал об этом. Я переименовал ссылку ограничения и ключа и «ParentId», но, к сожалению, проблема все еще сохраняется. – 2009-06-05 15:29:29

+0

Aw :-(Ах, хорошо, стоило попробовать ... извините, я не знаю, что еще предложить! –

0
  1. использовать InnoDB таблицы
  2. использование дозвуковых. MySqlInnoDBDataProvider вместо SubSonic. MySqlDataProvider !! (В противном случае дозвуковой будет молча игнорировать ваши FKs)
  3. определить первичный ключ для таблиц (не нужно быть уникальным)
  4. быть уверены, что ваша таблица определена была ФКС (MySQL молча игнорирует создание FK, если вы неправильно настройки ваш дб или таблица, в основном из-за пункта 1.) использовать: показать создать таблицу, чтобы убедиться

надеюсь, что это помогает ...

Смежные вопросы