【问题标题】:Self referencing many to many relationships in Fluent NHibernate automapping automapping to 1:n and not n:nFluent NHibernate 中的自引用多对多关系自动映射自动映射到 1:n 而不是 n:n
【发布时间】:2011-07-14 19:48:06
【问题描述】:

标题几乎解释了这一切,我有一个 Member 对象,它引用同样是 Member 类型的“朋友”。

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

【问题讨论】:

  • 您可以回答自己的问题。继续,将您的解决方案放在答案中并接受它。

标签: c# .net nhibernate fluent-nhibernate


【解决方案1】:

这样我就不必再在“未回答的 NHibernate 问题”列表的顶部看到这个问题了...

提问者 Eitan 找到了解决他自己问题的方法。他需要像这样指定ParentKeyColumnChildKeyColumn

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

mapping.HasManyToMany(m => m.Friends)
    .ParentKeyColumn("Member_Id")
    .ChildKeyColumn("Friend_Id")
    .Table("MemberFriendsLinkTable")
    .Inverse()
    .Cascade.SaveUpdate();

FluentNHibernate 默认命名外键列,如下所示:{className}_Id。由于多对多的两端是同一类型,因此它希望对两列使用相同的列名Member_Id。明确命名列可以避免这个问题。

【讨论】:

  • 我发现添加ParentKeyColumnChildKeyColumn 就足够了(当然,如果您提供的名称与默认名称不同)
  • .Inverse() 在我的情况下实际上抛出了一个异常,所以我不得不删除它,但除此之外,这个解决方案效果很好!
【解决方案2】:
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());

【讨论】:

    【解决方案3】:

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

    Fluent nhibernate m-to-m mapping with external table

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      相关资源
      最近更新 更多