为什么 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 两次...
另一种方法是延迟加载和批处理查询,但要求只往返数据库一次。
我有一个使用 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 两次...
另一种方法是延迟加载和批处理查询,但要求只往返数据库一次。