NHibernate бросать SQL CE Ошибка 25026 - PullRequest
0 голосов
/ 06 августа 2009

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

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

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

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

Дэвид Вениман Системы предвидения

1 Ответ

1 голос
/ 08 августа 2009

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

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

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

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

...