2012-10-05 61 views
0

我正在使用遗留代码(所以我想尽可能少地改变它),而且我在这里有很多关系有点麻烦。NHibernate在删除父项时删除ManyToMany记录

下面是我有:

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

回答

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的有没有其他办法的时候同样适用,删除功能时,则删除成对表记录(不能/不应该使数据库不一致)。

编辑: 在这种情况下,一个袋子级联应该没有。删除孤儿会导致非常危险的删除:不仅是对,而且还包括该关系的结尾。

编辑由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"))) 
}); 
+0

感谢您的答复,并采取这么长时间来回答对不起,我离开工作了周末前公布这一权利。 我改变了我的代码生成这个,但它仍然没有工作:(任何其他的想法? – Tejo

+0

嗨,我刚刚重新测试了上述解决方案。事实上有一个错误(现在修复),因为级联应该是“ none“,任何其他设置都不会影响pair表,但是会影响关系的结束,所以这种类型的映射应该可以工作,当一个末端被移除时,所有的对都会被删除。你呢? –

+0

现在是,非常感谢您的帮助。我可以通过代码映射来更改答案以显示等效代码吗? – Tejo