NHibernate标准与不同的父负载所有孩子?
我有一个父子关系,我想只返回一个父母并加载所有孩子。 我正在使用标准,因为它是一个动态查询。
var messageQueueId = this.GetPropertyName(x => x.Id); var query = _sessionManager.Session.CreateCriteria(QUEUE_ALIAS); query.SetFirstResult(_pageOffset); query.SetMaxResults(_pageSize); query.Add(Restrictions.In(messageQueueId, _messageQueueIds)); query.List();
这将返回父(MessageQueue),但不返回它的子(SearchMatches)。
当我尝试这样做时:
var query = _sessionManager.Session .CreateCriteria(QUEUE_ALIAS) .CreateAlias(this.GetPropertyName(x => x.SearchMatches) , MATCH_ALIAS, JoinType.LeftOuterJoin);
然后我让孩子们装满了,但我也收到了重复的父母。 我理解为什么会这样。 但是我不明白如何让第一个场景自动加载SearchMatches?
以下是我的权利:
public class MessageQueue : EntityBase { ... public virtual IList SearchMatches { get; set; } ... } public class SearchMatch : EntityBase { ... public virtual MessageQueue MessageQueue { get; set; } ... }
Fluent NHibernate设置为DefaultCascade.All()
。 我没有其他替代这些对象。
我试图使用MessageQueue覆盖的Inverse()
和Not.LazyLoad()
。 还试图关闭CreateAlias的EagerLoad。 但我仍然没有得到我需要的东西。
我建议使用batch-size=""
设置。 它最终会进入
1)我们发出的一个查询( query.List
),
2)NHibernate将使用一个(或几个)查询来为每个返回的MessageQueue
加载集合。
19.1.5。 使用批量提取
NHibernate可以有效地使用批量提取,也就是说,如果访问一个代理(或集合),NHibernate可以加载几个未初始化的代理。批量提取是惰性选择提取策略的优化。有两种方法可以调整批量提取:on类和集合级别。
批量获取类/实体更容易理解。 想象一下,您在运行时遇到以下情况:您在ISession中加载了25个Cat实例,每个Cat都有一个对其所有者的引用,即Person。 Person类使用代理映射,lazy =“true”。 如果您现在遍历所有猫并在每个猫上调用cat.Owner,NHibernate将默认执行25个SELECT语句,以检索代理所有者。 您可以通过在Person的映射中指定批量大小来调整此行为:
...
流利的替代方案是(收集和class级)
.BatchSize(25)
还检查:
- 在使用Oracle时,如何使用Fluent NHibernate实现批量提取?
- 如何在NHibernate中没有重复地加载加载关联?
- 带有Fetch的NHibernate QueryOver导致多个sql查询和db命中
注意:最后,作为批量大小传递的数字,例如25,似乎用作它的一半 – 12.因此,如果您在25的大小上进行分页,请尝试使用
SetBatchSize(50)