[英]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.