Fluent Mapping Many-Many与排序

时间:2014-04-02 22:54:49

标签: nhibernate fluent-nhibernate

我尝试使用Fluent Nhibernate来建立多对多的关系。

我有ProductRelatedProduct

Product {Id, Name...}
ProductRelated{Id, ProductId, RelatedProductId, relOrder}

Product

映射看起来像

  HasManyToMany(x => x.RelatedProducts)
                .Table("ProductRelated")
                .ReadOnly()
                .ChildOrderBy("relOrder asc")
                .ParentKeyColumn("ProductId")
                .ChildKeyColumn("RelatedProductId");

当对Product进行查询并且RelatedProducts延迟加载时,我可以看到使用联接表上的relOrder正确应用排序。

Session.Query<Product>()
       .FetchMany(p => p.Categories)
       .FetchMany(p => p.Departments)

一旦我添加了相关产品的热切加载,NHibernate会尝试按产品本身的relOrder列进行排序,而不是在连接表上进行排序。

Session.Query<Product>()
       .FetchMany(p => p.Categories)
       .FetchMany(p => p.Departments)
       .FetchMany(p => p.RelatedProducts)

有什么想法在这里发生?

1 个答案:

答案 0 :(得分:2)

那么回答你的问题这里发生了什么?,我会说,你正在使用:&#34; not-together拟​​合功能&#34; NHibernate。

文档6.6. Sorted Collections的摘要:

  

设置order-by属性告诉NHibernate ...

     

注意:如果这些集合中的查找操作包含多个元素,那么查找操作会非常慢。

     

注意:order-by属性的值是SQL排序,而不是HQL排序!

所以,这只适用于&#34;标准&#34;延迟加载,因为这种功能仅适用于数据库端。 在内存中管理订单

作为对应部分,渴望获取是一种不同的方式,如何生成和向DB发出SQL语句。

所以,渴望和order-by永远不会一起工作。

*

我的注意:我只需要附加此内容。 我无法帮助自己

予。

Eager抓取是应该避免的功能(我从不使用它,但它是我的)。有一个更好的解决方案,它设置BatchSize(),这会将1 + N减少到1+(少数)并保留所有(懒惰)特征,包括order-by。如果感兴趣,请检查这些:

BatchSize()也支持{p> HasManyToManyToManyBase

/// <summary>Specify the select batch size </summary>
/// <param name="size">Batch size</param>
public T BatchSize(int size) { ...

II。

many-to-many映射虽然看起来很花哨但不是我建议的方式。尝试重新考虑您的模型,并为配对对象介绍第一级公民PairingEntity。然后,它会使用many-to-oneone-to-many映射,这可能会给我们带来更多......例如像子查询一样改进了查询...尝试检查这些: