流畅的 NHibernate 和朋友关系

Posted

技术标签:

【中文标题】流畅的 NHibernate 和朋友关系【英文标题】:Fluent NHibernate and friend relationship 【发布时间】:2011-05-28 16:24:12 【问题描述】:

我需要用 Fluent NHibernate 建模朋友关系。我的公司模型与相关公司有List<Company> Related。公司之间的关系在我的数据库中建模为 related 表,如下所示:

customer_id | related_id

这两列都是我的customers 表中PK 的外键。

问题是每对关系只保存一次(你称之为双向吗?)。

如果以其他方式更容易解决,我可以更改表结构。

我需要映射 Fluent NHibernate,这样当我执行 customer.Related() 时,它会生成如下查询:

SELECT * FROM companies LEFT JOIN related ON customer_id = id OR related_id = id

我尝试了多种不同的方式来映射它,我尝试过的最接近的是:

HasManyToMany(x => x.Related)
       .Inverse()
       .ParentKeyColumn("customer_id")
       .ChildKeyColumn("related_id")
       .Table("relations")
       .Cascade.All();

但是,这(当然)仅在 customer_id 匹配时才映射。

我该如何解决这个问题?

编辑: 我认为它类似于Fluent NHibernate: How to create one-to-many bidirectional mapping?,但对我没有多大帮助。

【问题讨论】:

@Michael,感谢您的回答。我已经有了.Inverse()。还是我误会了你? 【参考方案1】:

我认为您想要实现的目标已经完成了一半。您已经使用 Many2Many 关系映射了 2 个实体。我不会再接触映射了。

相反,我会通过该映射查询我想要的内容。像这样的。

function GetRelated(long id)

   return Session.Query<Related>()
                 .Where(r=>r.Customer.Id == id || r.Related.Id == id)
                 .ToList(); 

建议,映射实体的名称是相关的,并且您有一个相关字段可能听起来令人困惑,所以我建议您将其重命名为其他名称(如果可能)。

希望对你有帮助。

【讨论】:

以上是关于流畅的 NHibernate 和朋友关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个实体到另一个实体之间创建 NHibernate 关系映射(即继承映射)

流畅的 nHibernate 映射问题

流畅的nhibernate父子映射

使用 ADO.NET 流畅的 NHibernate 地图

NHibernate 效率

NHibernate体系结构