【问题标题】:NHibernate, simple question, extra associationNHibernate,简单的问题,额外的关联
【发布时间】:2011-04-26 12:09:24
【问题描述】:

我的这个问题一直困扰着我,而我庞大而深不可测的智慧就是无法理解它。案例:我想使用流畅的 nhibernate 自动映射器和导出模式与同一个实体建立多个一对多关系。

我有:

基类:

 public abstract class Post<T> : Entity, IVotable, IHierarchy<T>
 {
    public virtual string Name
    {
        get; set;
    }

    public virtual string BodyText
    {
        get; set;
    }

    public virtual Member Author
    {
        get; set;
    }
}

和继承类:

 [Serializable]
public class WallPost : Post<WallPost>
{
    public virtual Member Receiver
    {
        get; set;
    }
}

WallPost 的“成员”属性是与此类的外键关系:

public class Member : Entity
    {
        public Member()
        {
           WallPosts = new IList<WallPost>();
        }

 public virtual IList<WallPost> WallPosts
        {
            get; set;
        }
}

我希望你和我在一起直到现在。当我运行 nhibernate 的导出模式时,我希望得到一个带有“author_id”和“receiver_id”的表墙贴,但我得到了 author_id、receiver_id、member_id。为什么 Nhibernate 框架添加 member_id,如果是用于帖子集合(IList),那么您如何指定它应该用来填充的外键关系是接收者,即 member.WallPosts 将返回接收者的所有墙贴。

我希望我是有道理的,如果您需要其他任何东西来回答这个问题,请告诉我,我会尽力提供。

提前致谢

附:如果我将属性名称从“Receiver”更改为“Member”,即 public virtual Member Member,则只会创建两个关联,而不是 3 个,author_id 和 member_id。

E

其他人对此问题的解决方案是添加一个覆盖:

mapping.HasMany(x => x.WallPosts).KeyColumn("Receiver_id");

【问题讨论】:

    标签: c# asp.net database nhibernate orm


    【解决方案1】:

    很可能(我不使用自动映射,我更喜欢编写自己的类映射)这是因为自动映射假设您的会员的“WallPosts”由墙贴控制。因此,它会为该关系创建一个 member_id。

    编辑:尝试在您的流利配置中添加覆盖,在 AutoMap 添加之后:

    .Override<Member>(map =>
    {
      map.HasMany(x => x.WallPosts, "receiver_id")
        .Inverse;
    });
    

    【讨论】:

    • 是的,但我希望会员的墙贴由 receiver_id 而不是 member_id 控制。
    • 是的,这只是自动映射的其中一项功能,这就是为什么我更喜欢编写类映射,尝试为成员覆盖映射。我已经编辑了我的答案。
    • 哇,好用,谢谢!我最后加了:mapping.HasMany(x => x.WallPosts).KeyColumn("Receiver_id");
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多