C# 用NHibernate删除树
我正在努力解决一个小问题,并开始得出结论,这根本不可能 我有一张桌子叫Group。与大多数这些系统一样,该组有一个ParentGroup和一个Children集合。因此,表组如下所示:C# 用NHibernate删除树,c#,.net,nhibernate,cascading-deletes,C#,.net,Nhibernate,Cascading Deletes,我正在努力解决一个小问题,并开始得出结论,这根本不可能 我有一张桌子叫Group。与大多数这些系统一样,该组有一个ParentGroup和一个Children集合。因此,表组如下所示: Group -ID (PK) -Name -ParentId (FK) 我使用FNH AutoMappings进行映射,但我必须覆盖以下默认值: p.References(x => x.Parent) .Column("ParentId") .Cascade.All(); p.
Group
-ID (PK)
-Name
-ParentId (FK)
我使用FNH AutoMappings进行映射,但我必须覆盖以下默认值:
p.References(x => x.Parent)
.Column("ParentId")
.Cascade.All();
p.HasMany(x => x.Children)
.KeyColumn("ParentId")
.ForeignKeyCascadeOnDelete()
.Cascade.AllDeleteOrphan()
.Inverse();
现在,总的想法是能够删除一个节点,它的所有子节点也可以被NH删除。因此,删除唯一的根节点应该基本上清除整个表
我首先尝试了使用Cascade.AllDeleteOrphan
,但这只适用于从子集合中删除项目,而不适用于删除父集合
接下来,我尝试了ForeignKeyCascadeOnDelete
,以便通过delete cascade上的将操作委派给数据库。但一旦我这么做了,MSSQLS2008就不允许我创建此约束,失败的原因是:
引入外键约束
表“组”上的“FKBA21C18E87B9D9F7”
可能导致循环或多次级联
路径。指定在删除时不执行任何操作或
更新时不执行任何操作,或修改其他
外键约束
对我来说,就是这样。我想我将循环遍历这些子项,并逐个删除它们,从而执行N+1。如果有人对如何更优雅地做到这一点有什么建议,我很想听听。我就是这样做的,效果很好
public class Node_Map : ClassMap<Node>
{
public Node_Map()
{
References(x => x.Parent, "IdCmsNodeParent");
HasMany(x => x.Childs).AsBag()
.Inverse()
.Cascade.Delete()
.KeyColumn("IdNodeParent");
}
}
公共类节点\u映射:类映射
{
公共节点映射()
{
参考文献(x=>x.Parent,“IdCmsNodeParent”);
HasMany(x=>x.Childs).AsBag()
.Inverse()
.Cascade.Delete()
.KeyColumn(“IdNodeParent”);
}
}
但是,如果NHibernate删除它,您将得到N+1。只有正确的数据库约束才能一次性删除它
如果您想在SQLServer2008中高效地执行此操作,那么应该使用递归CTE
检查:
但这样子对象和父对象就不会使用同一列了?您将得到两个FK列:IdCmsNodeParent和IdNodeParent应该只有一个。。无论如何,谢谢你的链接!呃,对不起。IdCmsNodeParent应该是IdNodeParent。我复制粘贴了我的代码,我想删除单词“Cms”,因为它没有任何信息,但我忘了在引用方法中删除它。酷。谢谢。我试试看