标题几乎解释了这一切,我有一个成员对象,引用了也是类型成员的'朋友'。
public class Member : Entity
{
public Member()
{
Friends = new List<Member>();
}
public virtual IList<Member> Friends
{
get; set;
}
}
模式生成工具使它成为1:n关系,而它应该是n:n关系,即一个列被添加到名为member_id的成员表中,并且不会创建连接表。
有没有办法让自我在Fluent NHibernate中引用多对多的关系?
我尝试使用之前得到的覆盖作为答案:
public class MemberOverride : IAutoMappingOverride<Member>
{
public void Override(AutoMapping<Member> mapping)
{
mapping.HasManyToMany(m => m.Friends)
.Table("MemberFriendsLinkTable");
}
}
但我收到错误消息:
“NHibernate.MappingException:集合映射中的重复列:Proj.BO.Member.Friends列:Member_id”
由于
编辑:我找到了答案,就是这样:
mapping.HasManyToMany(m => m.Friends).ParentKeyColumn("Member_Id").ChildKeyColumn("Friend_Id")
.Table("MemberFriendsLinkTable").Inverse().Cascade.SaveUpdate();
答案 0 :(得分:5)
所以我不必再在“未答复的NHibernate问题”列表的顶部看到这个问题......
提问者艾坦发现了解决自己问题的方法。他需要像这样指定ParentKeyColumn
和ChildKeyColumn
:
编辑:我找到了答案,就是这样:
mapping.HasManyToMany(m => m.Friends) .ParentKeyColumn("Member_Id") .ChildKeyColumn("Friend_Id") .Table("MemberFriendsLinkTable") .Inverse() .Cascade.SaveUpdate();
默认情况下,FluentNHibernate将外键列命名为:{className}_Id
。由于多对多的两端都是相同的类型,因此它希望对两列使用相同的列名Member_Id
。明确命名列可以避免这个问题。
答案 1 :(得分:0)
References(x => x.Parent)
.Class<Parent>()
.Access.Property()
.Cascade.None()
.LazyLoad()
.Not.Insert()
.Not.Update()
.Columns("PARENT_ID");
HasMany(x => x.Children)
.Access.Property()
.AsBag()
.Cascade.SaveUpdate()
.LazyLoad()
.Inverse()
.Generic()
.KeyColumns.Add("PARENT_ID", mapping => mapping.Name("PARENT_ID")
.SqlType("NUMBER")
.Not.Nullable());
答案 2 :(得分:0)
嗯,我明白,我有类似的问题,一点点改变。您能否尝试回答链接中的问题