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;
由于Dealer
和Domain
之间没有直接关系,我认为您不能直接映射它。
【讨论】:
我不清楚这如何回答我的问题。你能根据我的情况解释一下吗? 感谢您提供更新的答案/解释。我认为如果无法绘制路线,您所描述的路线将是一种合理的方式。您知道是否可以基于原始 SQL 创建映射? @erickh:最接近的可能是此处描述的命名查询:sidesofmarch.com/index.php/archive/2009/02/11/…,但它需要一个会话。您还会开始用持久性问题污染您的模型,这可能不是一个好主意以上是关于Fluent Nhibernate 映射多重连接的主要内容,如果未能解决你的问题,请参考以下文章
Fluent NHibernate 多对多映射,使用自动生成的 pk 而不是复合键
使用 Fluent NHibernate 和 NHibernate 3 将枚举映射为 Int