Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用NHibernate删除树_C#_.net_Nhibernate_Cascading Deletes - Fatal编程技术网

C# 用NHibernate删除树

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。与大多数这些系统一样,该组有一个ParentGroup和一个Children集合。因此,表组如下所示:

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”,因为它没有任何信息,但我忘了在引用方法中删除它。酷。谢谢。我试试看