我正在处理遗留代码(所以我想尽可能少地改变它),而且我在这里遇到了很多关系。
这就是我所拥有的:
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
答案 0 :(得分:1)
我的经验更多是使用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在删除Feature时没有别的办法,然后删除Pair-table记录(不能/不应该让DB不一致)。
EDITED: 在这种情况下,行李箱的级联应该是无。 delete-orphan会导致非常危险的删除:不仅是对,还有该关系的结尾。
编辑OP:这是我们使用Mapping by Code:
所拥有的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")))
});