c# – 级联错误:被删除的对象将被级联重新保存

我有一个项目由NHibernate实现和使用Lazy加载.
在这个项目中有两个班:人与家庭.
这两者之间的关系是聚合,意思是Person有一个Person列表.
地图是:
<class name="Person" table="Person_Person" >

    <id name="Id" type="Int64" unsaved-value="0">
      <generator class="native" />
    </id>

    <bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" >
      <key column="Person_id_fk"/>
      <one-to-many class="Domain.Entities.Family,Domain.Entities"/>
    </bag>

  </class>

在这个项目中,我通过ID获取一个人,然后删除一个家庭的家人.

Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
    if (fam.Name == "Jaun")
        SessionInstance.Delete(fam);

家庭没有删除,因为这个消息抛出异常:
删除的对象将被级联重新保存(从关联中删除删除的对象)[Domain.Entities.Family#167]

我如何删除一个人的家庭?

解决方法

基本上NHibernate所抱怨的是,你明确地告诉它删除家庭的记录,然后当你重新保存个人时,家庭将被放回原位,因为该人还在其中引用了家庭清单

相反,NHibernate告诉您以面向对象的方式处理这种关系,NHibernate允许您使用它.只需从Person.Family列表中删除对“Jaun”家族的引用,然后保留Person.当您这样做时,NHibernate将删除该家族与该人员之间的关系.如果“家庭”现在不再被其他任何参考,因为您将“级联”属性设置为“全删除孤儿”,“Jaun”族记录将从数据库中完全删除.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...