具有多个关系的2个类的NHibernate映射

具有多个关系的2个类的NHibernate映射,nhibernate,Nhibernate,尝试使用NHibernate来持久化两个对象之间有多个关联的新实例时,我遇到以下错误: NHibernate.Exceptions.GenericADOException: could not insert: [MyProject.BusinessEntities.Client][SQL: INSERT INTO dbo.Client (Version, CurrentEvent_ClientEvent_Id, EntityType, Id) VALUES (?, ?, 'MyProject.

尝试使用NHibernate来持久化两个对象之间有多个关联的新实例时,我遇到以下错误:

 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'.
场景如下:

我有两个类(为了清楚起见,我已经重命名了它们):Client和ClientEvent。 客户端有一个名为Events的属性,该属性的类型为List。ClientEvent包含一个属性“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" />
<many-to-one name="Client" access="property" class="MyProject.BusinessEntities.Client, MyProject.BusinessEntities" column="Client_Id" cascade="save-update" />
查看NHibernate的SQL输出,它似乎试图在保存ClientEvent记录之前保存客户端记录,试图将ClientEvent Id插入外键,但由于ClientEvent记录尚不存在而失败

问题

  • 有没有人能在nhibernate将对象与多个关系进行持久化的情况下使用它
  • 如果是,映射应该是什么样子
  • 对我可以尝试的事情有什么建议吗
抱歉,这篇长篇大论的文章

我想是关于级联的,请尝试更改映射中级联的值。
不是100%确定,但是,尝试在多对一映射中将级联设置为“无”

谢谢,我尝试了在客户端和客户端映射中将级联属性设置为“保存更新”或“无”的所有组合,但没有成功

然而,通过从头开始逐步建立映射,我发现了问题所在。。。。我在客户端和客户端对象上设置Id,而不是让NHibernate在对象持久化时生成值。在大多数情况下,在持久化对象之前是否显式设置Id似乎并不重要。但是,在本例中,NHibernate似乎错误地解析了对象需要持久化的顺序,并尝试持久化引用不存在的ClientEvent的客户端记录

解决方案:让NHibernate为对象生成标识符

var newClient = CreateNewClient();
var newEvent = CreateNewEvent();
newEvent.client = newClient; // ensure the reverse association is set
newClient.Events.Add(newEvent);
session.SaveOrUpdate(newClient);
session.Flush();