Я получаю следующую ошибку при попытке использовать NHibernate для сохранения нового экземпляра 2 объектов, которые имеют более одной связи между ними:
NHibernate.Exceptions.GenericADOException: could not insert: [MyProject.BusinessEntities.Client][SQL: INSERT INTO dbo.Client (Version, CurrentEvent_ClientEvent_Id, EntityType, Id) VALUES (?, ?, 'MyProject.BusinessEntities.Client', ?)] ---> System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK328F067A46E318FD". The conflict occurred in database "DatabaseName", table "dbo.ClientEvent", column 'ClientId'.
Сценарий выглядит следующим образом:
У меня есть 2 класса (которые я переименовал для ясности): Client и ClientEvent.
У клиента есть свойство с именем Events, которое имеет тип List. ClientEvent содержит свойство «Client», которое является обратной связью с объектом Client.
Кроме того, класс Client имеет другое свойство CurrentEvent, которое содержит ссылку на один из элементов в коллекции ClientEvents.
Client.hbm.xml содержит:
<bag name="ClientEvents" access="field.camelcase-underscore" inverse="true" cascade="save-update">
<key column="Client_Id"/>
<one-to-many class="MyProject.BusinessEntities.ClientEvent, MyProject.BusinessEntities" />
</bag>
<many-to-one name="CurrentEvent" access="property" class="MyProject.BusinessEntities.ClientEvent, MyProject.BusinessEntities" column="CurrentEvent_ClientEvent_Id" cascade="save-update" />
ClientStatusRecord.hbm.xml содержит:
<many-to-one name="Client" access="property" class="MyProject.BusinessEntities.Client, MyProject.BusinessEntities" column="Client_Id" cascade="save-update" />
Я автоматически генерирую схему базы данных из сопоставлений, и внешние ключи в обеих таблицах обнуляются.
Я использую следующий код для сохранения нового клиента и ClientRecord (снова упрощено, чтобы удалить все gumpf управления сеансом)
var newClient = CreateNewClient();
var newEvent = CreateNewEvent();
newEvent.client = newClient; // ensure the reverse association is set
newClient.Events.Add(newEvent);
session.SaveOrUpdate(newClient);
session.Flush();
Взглянув на вывод SQL из NHibernate, он, похоже, пытается сохранить запись клиента перед сохранением записи ClientEvent, пытается вставить идентификатор ClientEvent во внешний ключ, который завершается ошибкой, поскольку запись ClientEvent еще не существует
Вопросы
- Кто-нибудь заставил его работать там, где nhibernate сохраняет объект с несколькими связями?
- Если это так, как должны выглядеть сопоставления?
- Есть предложения, что я могу попробовать?
Извините за длинный пост