Fluent Nhibernate 映射多重连接

Posted

技术标签:

【中文标题】Fluent Nhibernate 映射多重连接【英文标题】:Fluent Nhibernate Mapping Multiple Join 【发布时间】:2012-01-10 18:02:13 【问题描述】:

我是一个 Nhibernate 新手,我一直在研究,但无法弄清楚如何使用 Nhibernate 映射来完成我想要的。

我的对象有以下表格

域 公司 经销商

域可以有多个公司,而公司可以属于多个域。公司有很多经销商,但经销商只属于一家公司。我想要我的域的映射,以通过公司生成属于它的所有经销商的列表。

我有一个名为 CompanyDomains 的连接表(包含 CompanyID 和 DomainID 列),它维护公司和域之间的多对多关系。此表当前未映射到我的 Nhibernate 设置中...我只是在我的域映射中使用 HasManyToMany 加入它。 Dealers 表有一列带有 CompanyID。

我想要的结果很容易通过 SQL 查询获得:

SELECT * FROM Dealers
JOIN Companies on Companies.ID = Dealers.CompanyID
JOIN CompanyDomains on Companies.ID = CompanyDomains.CompanyID
WHERE DomainID = 1

这给了我分配到域的所有经销商。

我的问题是,我想要一个在我的域映射中的经销商列表。我如何用 Nhibernate 映射它?

如果我在其他地方忽略了此解决方案,请为我指明正确的方向,否则我感谢您提供的任何帮助。

谢谢! 埃里克

【问题讨论】:

【参考方案1】:

一种可能的解决方案是为具有HasMany 的公司映射Dealers 集合,并将便利属性添加到Domain

public class Domain

    ...
    public virtual IList<Company> Companies  get; private set; 
    public IList<Dealer> Dealers 
     
        get  return Companies.SelectMany(x => x.Dealers).Distinct(); 
    


public class Company

    ...
    public virtual IList<Domain> Domains  get; private set; 
    public virtual IList<Dealer> Dealers  get; private set;  


public class Dealer

    ...
    public virtual Company Company  get; private set; 

由于DealerDomain 之间没有直接关系,我认为您不能直接映射它。

【讨论】:

我不清楚这如何回答我的问题。你能根据我的情况解释一下吗? 感谢您提供更新的答案/解释。我认为如果无法绘制路线,您所描述的路线将是一种合理的方式。您知道是否可以基于原始 SQL 创建映射? @erickh:最接近的可能是此处描述的命名查询:sidesofmarch.com/index.php/archive/2009/02/11/…,但它需要一个会话。您还会开始用持久性问题污染您的模型,这可能不是一个好主意

以上是关于Fluent Nhibernate 映射多重连接的主要内容,如果未能解决你的问题,请参考以下文章

Fluent NHibernate 多对多映射,使用自动生成的 pk 而不是复合键

Fluent 映射和 NHibernate Xml 配置

使用 Fluent NHibernate 和 NHibernate 3 将枚举映射为 Int

使用 Fluent NHibernate 映射泛型类

使用 2 种策略通过 fluent nhibernate 映射类层次结构

Fluent NHibernate 为重叠实体创建实体映射