自我引用Fluent NHibernate中的多对多关系自动化自动化为1:n而不是n:n

时间:2011-03-14 07:15:35

标签: c# .net nhibernate fluent-nhibernate

标题几乎解释了这一切,我有一个成员对象,引用了也是类型成员的'朋友'。

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();

3 个答案:

答案 0 :(得分:5)

所以我不必再在“未答复的NHibernate问题”列表的顶部看到这个问题......

提问者艾坦发现了解决自己问题的方法。他需要像这样指定ParentKeyColumnChildKeyColumn

  

编辑:我找到了答案,就是这样:

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)

嗯,我明白,我有类似的问题,一点点改变。您能否尝试回答链接中的问题

Fluent nhibernate m-to-m mapping with external table