SubSonic не генерирует таблицы внешнего ключа MySql

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

//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;

person Community    schedule 05.06.2009    source источник


Ответы (3)


У меня работает с этими настройками.

  <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, кажется, кэширует схему таблиц. См .: http://code.google.com/p/subsonicproject/issues/detail?id=87

person Jürgen Steinblock    schedule 05.06.2009
comment
Готово - большое спасибо! Я погуглил конфиг до смерти, но не нашел параметр generateRelatedTablesAsProperties. Очень полезно, т. - person ; 05.06.2009
comment
np, но сгенерироватьRelatedTablesAsProperties = true в первую очередь не должно быть проблемой. По сути, это превратит общедоступный метод Product.GetOrders () в общедоступное свойство Product.Orders. - person Jürgen Steinblock; 06.06.2009

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

надеюсь это поможет...

person Rolo    schedule 30.10.2009
comment
Этот сделал свою работу. - person Xin; 14.11.2019

Я не специалист по дозвуковой технологии, но мне интересно, может ли в вашем синтаксисе техническое нарушение одного правила, которое, возможно, сбивает с толку дозвуковой: согласно Справочник по MySQL,

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

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

person Alex Martelli    schedule 05.06.2009
comment
Алекс, большое спасибо за быстрый ответ. Я не думал об этом. Я переименовал ограничение, ключ и ссылки ParentId, но, к сожалению, проблема все еще не устранена. - person ; 05.06.2009
comment
Ой :-(. Ну что ж, стоило попробовать ... извините, я не знаю, что еще предложить! - person Alex Martelli; 05.06.2009