mar*_*arn 6 c# nhibernate cascade nhibernate-mapping cascading-deletes
方案如下,
我有3个名为Parent的对象(我简化名称),父母的子女和孩子的
父母的孩子是父母的集合,孩子的孩子是孩子的集合.
映射如下(相关部分)
亲
<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>
Run Code Online (Sandbox Code Playgroud)
父母的孩子
<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>
Run Code Online (Sandbox Code Playgroud)
我想要实现的是,当我删除父级时,会有一个级联删除一直到孩子的孩子.但目前发生的是这个.
(这纯粹用于映射测试目的)获取父实体(工作正常)
IQuery query = session.CreateQuery("from Parent where ID =" + ID);
IParent doc = query.UniqueResult<Parent>();
Run Code Online (Sandbox Code Playgroud)
现在删除部分
session.Delete(doc);
transaction.Commit();
Run Code Online (Sandbox Code Playgroud)
在使用级联和反向解决了"无法插入空值"错误后,我希望现在可以使用此代码删除所有内容,但只删除父项.
我错过了可能错过的映射中的某些内容吗?任何正确方向的提示都非常受欢迎!
迭戈,谢谢你的回答.(和解释)
我去除了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>
Run Code Online (Sandbox Code Playgroud)
父母的孩子
<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>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助人们解决同样的问题!
通过设置on-delete="cascade"键,您可以让DB处理级联.
您是否使用NHibernate生成架构?
我刚刚复制了你的例子,它在没有那个属性的情况下运行良好.移除它时,NHibernate会进行级联.
顺便说lazy="false" fetch="subselect"一下,默认情况下你不应该使用.如果删除这些属性,请保留on-delete="cascade"并更改cascade为save-update,您将只有两个查询来检索和删除父级.
| 归档时间: |
|
| 查看次数: |
6158 次 |
| 最近记录: |