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

Why is nHibernate lazy loading and ignoring the results of a future query?

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

Level4 有很多 Level3,Level3 有很多 Level2,Level1 有很多 Level1,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 位交换为急切提取?

(已编辑问题以简化示例)

经过大量调查后,我唯一能做到这一点的方法是更改​​我的所有查询,使它们具有相同的 TRoot。 IE。更改它们,使它们都像这样开始:

this.Session.QueryOver<Level4>()

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

FishMonger

Collection of Fish

Collection of Eye Collection of Bone

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

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