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 检索/保存链接到其他实体的日志条目的最佳方法是啥?

如何使用流利的 nhibernate 设置 generate_statistics = true

流利的 NHibernate 多对多与额外的列不插入

Fluent NHibernate 仅级联删除关联记录