2009-08-05 3 views
0

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

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

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

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

Дэвид Veeneman Foresight Systems

+0

Пожалуйста, включите ваши сопоставления в вопрос. – ahsteele

ответ

1

Я нашел ответ. Это связано с тем, как NHibernate обрабатывает ассоциации «один ко многим». Из документации NHibernate, Sec. 6,4, One-To-Many Associations:

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

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

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

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