NHibernate выбрасывает ошибку SQL CE 25026

Я использую NHibernate с базой данных рабочего стола SQL CE и получаю странную ошибку, когда пытаюсь выполнить обновление. SQL CE выдает ошибку 25026: «Невозможно вставить значение внешнего ключа, поскольку соответствующее значение первичного ключа не существует».

Исключение возникает при выполнении каскадного обновления свойства коллекции объекта сущности. Объект сущности - это владелец, а свойство коллекции - это проекты (IList), проекты для конкретного владельца. В моей базе данных первичный ключ таблицы Owners представляет собой трехсимвольную строку (инициалы владельца) с соответствующим внешним ключом в таблице Projects.

Вот почему я озадачен: NHibernate может получить все записи для определенного владельца (например, «DCV»). И в моем коде я могу без проблем добавить новый объект Project в Owner.Projects. Я беру значение идентификатора владельца непосредственно из объекта Owner, полученного из базы данных, поэтому я знаю, что первичный ключ существует в таблице Owners. Но когда я выполняю ISession.SaveOrUpdate () для моего объекта Owner, я получаю ошибку внешнего ключа, описанную выше.

Имею ли я дело с некоторой идиосинкразией NHibernate или какой-то приземленной ошибкой в ​​моем коде или сопоставлениях? Мы очень ценим любые мысли, которые помогут мне решить эту проблему!

Дэвид Винеман Форсайт-системы


person David Veeneman    schedule 05.08.2009    source источник
comment
Пожалуйста, укажите свои сопоставления в вопросе.   -  person ahsteele    schedule 06.08.2009


Ответы (1)


Я нашел ответ. Это связано с тем, как NHibernate обрабатывает ассоциации "один ко многим". Из документации NHibernate, раздел. 6.4, "Один ко многим":

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

Если у вас возникла эта проблема, временно удалите ограничение внешнего ключа и запустите свой код, выводя SQL NHibernate на консоль. Вы увидите, что NHibernate сначала вставляет новую запись без внешнего ключа, затем вызывает запись, а затем вставляет внешний ключ в запись. Первая операция - это то, что вызывает ошибку внешнего ключа.

Решение, как указано в документации NHibernate, состоит в том, чтобы сделать отношение двунаправленным.

person David Veeneman    schedule 07.08.2009