Свободный NHibernate: поле внешнего ключа не устанавливается в однонаправленной ассоциации - PullRequest
3 голосов
/ 29 ноября 2010

У меня есть база данных с таблицей ProbateCases и таблицей свойств.Таблица Properties имеет внешний ключ к таблице ProbateCases, называемый ProbateCaseId, поэтому взаимосвязь между ProbateCases и Properties является одно-ко-многим.

Мой уровень домена имеет класс ProbateCase и класс Property.Класс ProbateCase имеет коллекцию свойств, определенных следующим образом:

private IList<Property> _properties = new List<Property>();
public virtual IEnumerable<Property> Properties { get { return _properties; } }
public virtual Property AddProperty()
    {
      Property property = new Property();
      _properties.Add(property);
      return property;
    }

Соответствующая часть отображения Fluent NHibernate выглядит следующим образом:

HasMany(x => x.Properties).Where("Deleted = 0").KeyColumn("ProbateCaseId").Cascade.All().Access.CamelCaseField(Prefix.Underscore);

Обратите внимание, что связь является однонаправленной -Класс ProbateCase имеет коллекцию Properties, но класс Property не имеет члена ProbateCase.

Я считаю, что запросы работают нормально - NHibernate создает соответствующий SQL для получения свойств с соответствующим значением ProbateCaseId.

Однако, когда я сохраняю ProbateCase, в который я добавил новое свойство, INSERT SQL НЕ содержит значения для поля внешнего ключа - поэтому я получаю исключение SQL, жалующееся на значение NULL во внешнем ключе:

INSERT INTO AdminOverview.Properties (PropertyName) VALUES ('Name of property') -- Where the hell is the ProbateCaseId field value???

Стоит ли ожидать, что NHibernate сам заполнит значение внешнего ключа, или я должен что-то еще сделать?

1 Ответ

3 голосов
/ 29 ноября 2010

С http://nhibernate.info/doc/nh/en/index.html#collections-onetomany:

Очень важное примечание: если столбец ассоциации объявлен как NOT NULL, NHibernate может вызвать нарушение ограничений при создании или обновлении ассоциации. Чтобы предотвратить эту проблему, вы должны использовать двунаправленную ассоциацию с многозначным концом (набором или сумкой), помеченным как обратный = "true". См. Обсуждение двунаправленных ассоциаций далее в этой главе.

...