NHibernate标准与不同的父负载所有孩子?

时间:2014-11-07 16:54:24

标签: c# nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我有一个父子关系,我想只返回一个父母并加载所有孩子。我正在使用标准,因为它是一个动态查询。

var messageQueueId = this.GetPropertyName<MessageQueue>(x => x.Id);

var query = _sessionManager.Session.CreateCriteria<MessageQueue>(QUEUE_ALIAS);

query.SetFirstResult(_pageOffset);
query.SetMaxResults(_pageSize);
query.Add(Restrictions.In(messageQueueId, _messageQueueIds));

query.List<MessageQueue>();

这将返回父(MessageQueue),但不返回它的子(SearchMatches)。

当我尝试这样做时:

var query = _sessionManager.Session
    .CreateCriteria<MessageQueue>(QUEUE_ALIAS)
    .CreateAlias(this.GetPropertyName<MessageQueue>(x => x.SearchMatches)
                , MATCH_ALIAS, JoinType.LeftOuterJoin);

然后我把孩子们装上了,但我也收到了重复的父母。我明白为什么会这样。但是,我不明白如何让第一个场景自动加载SearchMatches?

以下是我的权利:

public class MessageQueue : EntityBase
{
    ...
    public virtual IList<SearchMatch> SearchMatches { get; set; }
    ...
}

public class SearchMatch : EntityBase
{
    ...
    public virtual MessageQueue MessageQueue { get; set; }
    ...
}

Fluent NHibernate设置为DefaultCascade.All()。我没有其他替代这些对象。

我尝试使用MessageQueue覆盖的Inverse()Not.LazyLoad()。还试图从CreateAlias的EagerLoad。但我仍然没有得到我需要的东西。

1 个答案:

答案 0 :(得分:2)

我建议使用 batch-size="" 设置。它将最终出现在 1)我们发出的一个查询(query.List<MessageQueue>();),
2)NHibernate将使用一个(或几个)查询来为每个返回的MessageQueue加载集合。

19.1.5. Using batch fetching

  

NHibernate可以有效地使用批量提取,也就是说,如果访问一个代理(或集合),NHibernate可以加载几个未初始化的代理。批量提取是懒惰选择提取策略的优化。有两种方法可以调整批处理获取:在类和集合级别上。

     

更容易理解批量提取类/实体。想象一下,您在运行时遇到以下情况:您在一个ISession中加载了25个Cat实例,每个Cat都有一个对其所有者的引用,一个Person。 Person类使用代理映射,lazy =“true”。如果您现在遍历所有猫并在每个猫上调用cat.Owner,NHibernate将默认执行25个SELECT语句,以检索代理所有者。您可以通过在Person:

的映射中指定批量大小来调整此行为
<class name="Person" batch-size="10">...</class>

流利的替代方案是(收集和班级)

.BatchSize(25)

同时检查:

  

注意:最后,作为批量大小传递的数字,例如25,似乎用作它的一半 - 12.所以,如果你的分页大小为25,请尝试使用SetBatchSize(50)