C# · 12月 26, 2021

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”族记录将从数据库中完全删除.