0

我正在使用遗留代码(所以我想尽可能少地改变它),我在这里的多对多关系遇到了一些麻烦。

这是我所拥有的:

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

我需要的是:当我删除一个功能时,它的功能配置文件也会被删除。请注意,我认为这可能适用于 NHibernate 2.x

4

1 回答 1

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 不一致)。

已编辑:在这种情况下,袋子的级联应该是无。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")))
}); 
于 2012-10-06T15:26:11.143 回答