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)