方案如下,
我有3个对象(我简化了名字)名为父母,父母的孩子&孩子的孩子
父母的孩子是父母的集合,孩子的孩子是孩子的集合。
映射如下(相关部分)
父
<set name="parentset"
table="pc-table"
lazy="false"
fetch="subselect"
cascade="all-delete-orphan"
inverse="true">
<key column=FK_ID_PC" on-delete="cascade"/>
<one-to-many class="parentchild,parentchild-ns"/>
</set>
父母的孩子
<set name="childset"
table="cc-table"
lazy="false"
fetch="subselect"
cascade="all-delete-orphan"
inverse="true">
<key column="FK_ID_CC" on-delete="cascade"/>
<one-to-many class="childschild,childschild-ns"/>
</set>
我想要实现的是,当我删除父母时,会有一个级联删除一直到孩子的孩子。但目前发生的是这个。
(这纯粹是为了映射测试目的) 获得父实体(工作正常)
IQuery query = session.CreateQuery("from Parent where ID =" + ID);
IParent doc = query.UniqueResult<Parent>();
现在删除部分
session.Delete(doc);
transaction.Commit();
用cascading和inverse解决'无法插入空值'错误之后我希望现在用这段代码删除所有内容,但只删除父代。
我是否遗漏了可能错过的地图中的某些内容?任何正确方向的提示都非常受欢迎!
我去了on-delete="cascade"
,这是因为我喜欢在代码中尽可能多地控制而不是在数据库中。
下面发布的代码是(工作)结果。
父
<set name="parentset"
table="pc-table"
cascade="all-delete-orphan"
inverse="true"
batch-size="5">
<key column=FK_ID_PC"/>
<one-to-many class="parentchild,parentchild-ns"/>
</set>
父母的孩子
<set name="childset"
table="cc-table"
cascade="all-delete-orphan"
batch-size="5"
inverse="true">
<key column="FK_ID_CC">
<one-to-many class="childschild,childschild-ns"/>
</set>
希望这有助于解决同样问题的人!
答案 0 :(得分:6)
通过在键上设置on-delete="cascade"
,您可以让DB处理级联。
您是否使用NHibernate生成架构?
我刚刚复制了你的例子,它在有和没有该属性的情况下运行良好。删除它时,NHibernate会进行级联。
顺便说一下,使用lazy="false" fetch="subselect"
并不是默认情况下你应该做的事情。如果您删除这些属性,请离开on-delete="cascade"
并将cascade
更改为save-update
,您只需要两个查询来检索和删除父级。