我尝试使用Fluent Nhibernate来建立多对多的关系。
我有Product
和RelatedProduct
表
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)
有什么想法在这里发生?
答案 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> HasManyToMany
:ToManyBase:
/// <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-one
和one-to-many
映射,这可能会给我们带来更多......例如像子查询一样改进了查询...尝试检查这些: