NHibernate:删除多对多关系中的记录

NHibernate:删除多对多关系中的记录,nhibernate,orm,Nhibernate,Orm,我有一个对象客户,这个对象有一个ISet联系人列表。当我删除客户时我想删除联系人 我使用下面的映射,我尝试了cascade中的所有选项,但仍然存在此问题: DELETE语句与引用约束“FK4FF8F4B29499D0A4”冲突。冲突发生在数据库“MyDB”、表“dbo.Contact”、列“Customer”中 映射客户 <set name="Contacts" table="CustomerContact" cascade="save-update"> <key co

我有一个对象
客户
,这个对象有一个
ISet
联系人列表。当我删除
客户时
我想删除
联系人

我使用下面的映射,我尝试了cascade中的所有选项,但仍然存在此问题: DELETE语句与引用约束“FK4FF8F4B29499D0A4”冲突。冲突发生在数据库“MyDB”、表“dbo.Contact”、列“Customer”中

映射
客户

<set name="Contacts" table="CustomerContact" cascade="save-update">
    <key column="Customer" />
    <many-to-many class="Contact" column="Contact" />
</set>
<many-to-one name="Customer" column="Customer" not-null="true" />

奇怪的是,客户和联系人之间有这样的关联映射。如果客户可以与多个联系人关联,反之亦然,那么双方都应该有多对多。但你们在接触端有多对一。您提到要将删除级联到联系人

也许您应该考虑将联系人集合映射为<强>一对多< <强> >。对于客户映射,请尝试此操作,注意属性

<set name="Contacts" 
     table="CustomerContact" 
     inverse="true" 
     cascade="all-delete-orphan" >

    <key column="Customer" />
    <one-to-many class="Contact" />
</set>

使用此联系人映射:

<many-to-one name="Customer" column="Customer" />


您还必须“追踪指针”:当从Customer.Contacts集合中删除相应的联系人时,将Customer.Contact设置为空

具有两种属性

 inverse="true" 

这是关键

除此之外,您还可以在删除客户对象时执行以下操作:

customer.Contacts.Clear();
Session.Delete(customer);

我的猜测是设置所有删除孤儿,但似乎你已经尝试过了。试着看看这个答案。感谢Dmitry 100%的工作:)有时候要理解NHibernate中的所有属性(反转…)并不容易
customer.Contacts.Clear();
Session.Delete(customer);