NHibernate,简单的问题,额外的关联

时间:2011-04-26 12:09:25

标签: c# asp.net database nhibernate orm

我有这个问题一直困扰着我,而我庞大而深不可测的智力无法掌握它。案例:我想使用流畅的nhibernate automapper和export模式与同一个实体建立多个一对多关系。

我有:

基类:

 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的exportschema时,我希望得到一个带有'author_id'和'receiver_id'的表wallpost但我得到author_id,receiver_id,member_id。为什么Nhibernate框架添加了member_id,如果是为了收集帖子(IList),那么如何指定它应该用于填充的foregin密钥关系是receiver,即member.WallPosts将返回接收者的所有wallpost。 / p>

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

提前致谢

P.S。如果我将属性名称从“Receiver”更改为“Member”即公共虚拟成员,则只会生成两个关联,而不是3,author_id和member_id。

电子

这个问题的解决方案对于任何人来说都是想要改写:

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

1 个答案:

答案 0 :(得分:3)

最有可能(我不使用自动映射,我更愿意编写自己的类图),因为自动映射假设你的会员的“WallPosts”由墙上帖子控制。因此它为该关系创建了一个member_id。

编辑:在AutoMap添加:

之后,尝试在fluent配置中添加覆盖
.Override<Member>(map =>
{
  map.HasMany(x => x.WallPosts, "receiver_id")
    .Inverse;
});