我有这个问题一直困扰着我,而我庞大而深不可测的智力无法掌握它。案例:我想使用流畅的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");
答案 0 :(得分:3)
最有可能(我不使用自动映射,我更愿意编写自己的类图),因为自动映射假设你的会员的“WallPosts”由墙上帖子控制。因此它为该关系创建了一个member_id。
编辑:在AutoMap添加:
之后,尝试在fluent配置中添加覆盖.Override<Member>(map =>
{
map.HasMany(x => x.WallPosts, "receiver_id")
.Inverse;
});