NHibernate,简单的问题,额外的关联
Posted
技术标签:
【中文标题】NHibernate,简单的问题,额外的关联【英文标题】:NHibernate, simple question, extra association 【发布时间】: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");
【问题讨论】:
【参考方案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");以上是关于NHibernate,简单的问题,额外的关联的主要内容,如果未能解决你的问题,请参考以下文章
当有许多关联时使用像 NHibernate 这样的 ORM - 性能问题
使用 NHibernate 从头开始:新的大型应用程序的提示
通过 NHibernate 检索/保存链接到其他实体的日志条目的最佳方法是啥?