为什么nHibernate延迟加载并忽略未来查询的结果?

时间:2016-05-09 21:24:43

标签: c# nhibernate fluent-nhibernate queryover

我有一个使用nHibernate从数据库中检索实体的方法。这是一个相当复杂的实体:

Level4有很多Level3,有很多Level2,有很多Level1,有Level1Ref

所以我使用了一些像这样的未来:

        var future = this.Session.QueryOver<Level4>()
            .Where(x => x.Id == level4Id)
            .Fetch(x => x.Level3List).Eager
            .Fetch(x => x.Level3List.First().Level2List).Eager
            .Left.JoinAlias(x => x.Level3List, () => level3Alias, x => x.AnotherThing.Id == anotherThingId)
            .FutureValue();

有些问题是这样的:

        this.Session.QueryOver<Level1>()
            .Fetch(x => x).Eager
            .Fetch(x => x.Level1Ref).Eager
            .Fetch(x => x.Level2).Eager
            .Inner.JoinAlias(x => x.Level2, () => level2Alias)
            .Inner.JoinAlias(() => level2Alias.Level3, () => level3Alias, x => x.AnotherThing.Id == anotherThingId && level3Alias.Level4.Id == level4Id)
            .Future();

然后:

var record = future.Value;

这都会生成我期望的SQL,但是当我尝试迭代Level2.Level1List时,它会延迟加载该列表中的记录。

问题:

这就是问题所在。我有什么?在我的查询中做错了nHibernate认为它需要到数据库获取它已经获得的信息? (我有一种预感,我需要将一些JoinQueryOver位换成热切的提取物吗?

(为简化示例而编辑的问题)

1 个答案:

答案 0 :(得分:1)

经过大量的调查后,我能够完成这项工作的唯一方法是更改​​所有查询,以便他们拥有相同的TRoot。 IE浏览器。改变他们所以他们都这样开始:

this.Session.QueryOver<Level4>()

在这种情况下,这显然不是理想的:

  

鱼贩

     
    

鱼的收集

         
      

眼睛的集合       骨的收集

    
  

这意味着我必须写两个查询并加入Fish两次......

另一种方法是延迟加载和批处理查询,但要求是只对数据库进行一次往返。