NHibernate删除父项时删除多条记录

NHibernate删除父项时删除多条记录,nhibernate,nhibernate-3,Nhibernate,Nhibernate 3,我使用的是遗留代码(因此我希望尽可能少地对其进行更改),而我在处理多对多关系时遇到了一些问题 以下是我所拥有的: public class Feature { List<Profile> Profiles{get;set;} } public class Profile{ List<FeatureProfile> Features{get;set;} } public class FeatureProfile { Feature Feat {get;

我使用的是遗留代码(因此我希望尽可能少地对其进行更改),而我在处理多对多关系时遇到了一些问题

以下是我所拥有的:

public class Feature {
   List<Profile> Profiles{get;set;}
}

public class Profile{
   List<FeatureProfile> Features{get;set;}
}

public class FeatureProfile {
   Feature Feat {get;set;}
   Profile Profile {get;set;}
}
公共类功能{
列表配置文件{get;set;}
}
公共班级简介{
列出要素{get;set;}
}
公共类功能配置文件{
功能专长{get;set;}
配置文件{get;set;}
}
它们的映射如下所示:

mapper.Class<Feature>(m=>
    m.Bag(x => x.Profiles, bagMap =>
                    {
                        bagMap.Table("FeatureProfile");
                        bagMap.Key(key=>key.Column("FeatureId"));
                        bagMap.Cascade(Cascade.All | Cascade.DeleteOrphans);
                    },map=>map.ManyToMany(manyToMany=>manyToMany.Column("ProfileId")))
);


mapper.Class<Profile>(m=>
    m.Bag(x => x.Features, bagMap =>
                    {
                        bagMap.Key(key=>key.Column("ProfileId"));
                        bagMap.Inverse(true);
                        bagMap.Cascade(Cascade.All | Cascade.DeleteOrphans);
                   })
);

mapper.Class<FeatureProfile>(m=> {
    m.ManyToOne(x => x.Profile, x => x.Column("ProfileId"));
    m.ManyToOne(x => x.Feat, x => x.Column("FeatureId"))
});
mapper.Class(m=>
m、 行李(x=>x.档案,行李地图=>
{
bagMap.表格(“特征配置文件”);
bagMap.Key(Key=>Key.Column(“FeatureId”);
bagMap.Cascade(Cascade.All | Cascade.delete孤儿);
},map=>map.manytomy(manytomy=>manytomy.Column(“ProfileId”))
);
类(m=>
m、 行李(x=>x.功能,行李地图=>
{
Key(Key=>Key.Column(“ProfileId”);
bagMap.Inverse(真);
bagMap.Cascade(Cascade.All | Cascade.delete孤儿);
})
);
类(m=>{
m、 manytone(x=>x.Profile,x=>x.Column(“ProfileId”);
m、 manytone(x=>x.Feat,x=>x.Column(“FeatureId”))
});
我需要的是:当我删除一个特性时,它的FeatureProfile也会被删除。
请注意,我认为这可能在NHibernate2.x中起作用,我的经验更多的是使用XML映射,但我想说,下面的行无论如何都可以帮助您。NHibernate为m:n关系提供直接映射(使用对表,如上例所示)。可以完全删除对象特征配置文件。该关系将被隐式映射,删除任何两端(轮廓或特征)时也将应用该关系


... 
...
... 
...
在这种情况下,NHibernate没有其他方法,在删除特性时,也可以删除对表记录(不能/不应该使数据库不一致)

编辑: 在这种情况下,行李的层叠应为无。删除孤立项会导致真正危险的删除:不仅是对,还包括该关系的末端

按操作编辑:下面是我们使用代码映射得到的结果:

mapper.Class<Profile>(m =>
{
    m.Bag(x => x.Features, bagMap =>
    {
        bagMap.Table("FeatureProfile");
        bagMap.Key(key=>key.Column("ProfileId"));
        bagMap.Lazy(CollectionLazy.Lazy)
        bagMap.Inverse(false);
        bagMap.Cascade(Cascade.None);
    },map=>map.ManyToMany(manyToMany=>manyToMany.Column("FeatureId")))
}

mapper.Class<Feature>(m =>
{
    m.Bag(x => x.Profiles, bagMap =>
    {
        bagMap.Table("FeatureProfile");
        bagMap.Key(key=>key.Column("FeatureId"));
        bagMap.Lazy(CollectionLazy.Lazy)
        bagMap.Inverse(false);
        bagMap.Cascade(Cascade.None);
    },map=>map.ManyToMany(manyToMany=>manyToMany.Column("ProfileId")))
}); 
mapper.Class(m=>
{
m、 行李(x=>x.功能,行李地图=>
{
bagMap.表格(“特征配置文件”);
Key(Key=>Key.Column(“ProfileId”);
bagMap.Lazy(CollectionLazy.Lazy)
bagMap.Inverse(假);
bagMap.Cascade(Cascade.None);
},map=>map.manytomy(manytomy=>manytomy.Column(“FeatureId”))
}
类(m=>
{
m、 行李(x=>x.档案,行李地图=>
{
bagMap.表格(“特征配置文件”);
bagMap.Key(Key=>Key.Column(“FeatureId”);
bagMap.Lazy(CollectionLazy.Lazy)
bagMap.Inverse(假);
bagMap.Cascade(Cascade.None);
},map=>map.manytomy(manytomy=>manytomy.Column(“ProfileId”))
}); 

感谢您的回复,很抱歉花了这么长时间才回复,我在周末下班前发布了此消息。我更改了代码以生成此消息,但仍然不起作用:(还有其他想法吗?您好。我刚刚重新测试了上述解决方案。事实上,有一个错误(现已修复),因为级联应该为“无”在这种情况下。任何其他设置都不会影响对表,但会影响关系的结尾。因此,这种类型的映射应该有效,当删除其中一个端点时,所有对也会被删除。它对您有效吗?现在有效了,非常感谢您的帮助。我可以更改您的答案以使用逐代码映射显示等效代码吗?是的,当然,调整它以显示真实的工作结果。很高兴它能工作
mapper.Class<Profile>(m =>
{
    m.Bag(x => x.Features, bagMap =>
    {
        bagMap.Table("FeatureProfile");
        bagMap.Key(key=>key.Column("ProfileId"));
        bagMap.Lazy(CollectionLazy.Lazy)
        bagMap.Inverse(false);
        bagMap.Cascade(Cascade.None);
    },map=>map.ManyToMany(manyToMany=>manyToMany.Column("FeatureId")))
}

mapper.Class<Feature>(m =>
{
    m.Bag(x => x.Profiles, bagMap =>
    {
        bagMap.Table("FeatureProfile");
        bagMap.Key(key=>key.Column("FeatureId"));
        bagMap.Lazy(CollectionLazy.Lazy)
        bagMap.Inverse(false);
        bagMap.Cascade(Cascade.None);
    },map=>map.ManyToMany(manyToMany=>manyToMany.Column("ProfileId")))
});