繁体   English   中英

NHibernate删除父项时删除ManyToMany记录

[英]NHibernate Removing ManyToMany record when deleting parent

我正在使用旧版代码(所以我想尽可能地对其进行更改),并且在这里与多对多关系存在一些麻烦。

这是我所拥有的:

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;}
}

他们的映射是这样的:

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"))
});

我需要的是:删除功能时,它的FeatureProfile也将被删除。 请注意,我认为这可能在NHibernate 2.x中有效

我的经验更多是与XML映射有关的,但是我想说下面的几行可以为您提供帮助。 NHibernate为m:n重复提供直接映射(如上例所示,使用Pair-table )。 您可以完全删除对象FeatureProfile 该关系将被隐式映射,并且删除两端(配置文件或功能)中的任何一个时,该关系均适用。

<class name="Feature"...>
... 
<bag name="Profiles" lazy="true" 
    table="FeatureProfile" cascade="none" >
  <key column="FeatureId" />
  <many-to-many class="Profile" column="ProfileId" />
</bag>
...

<class name="Profile"...>
... 
<bag name="Features" lazy="true" 
    table="FeatureProfile" cascade="none" >
  <key column="ProfileId" />
  <many-to-many class="Feature" column="FeatureId" />
</bag>
...

在这种情况下,NHibernate别无他法,在删除功能时,还要删除配对表记录(不能/不应该使数据库不一致)。

编辑:在这种情况下,袋子的级联应该为空。 delete-orphan会导致非常危险的删除:不仅是对,而且关系的结尾。

按OP编辑:这是我们使用“按代码映射”的内容:

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")))
}); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM