给定一个使用Future调用的多层对象图:

var Dads = db.Session.Query<Parent>().Where(P => P.EntityKey == Id)
             .ToFuture<Parent>();
var Kids = db.Session.Query<Kid>().Where(K => K.Parent.EntityKey == Id)
             .ToFuture<Kid>();

当我调用var Dad = dads.ToList()时,我看到该批生产线通过并在探查器中显示。

问题是在枚举集合时它仍向数据库发送一次查询

例如。
for each (Kid kid in Dad.Kids) // This seems to hit the database
{
   Teach(kid);
}

发送一个SQL查询并访问数据库以获取每个 child 。为什么未填充对象图?还是这种预期的行为?

最佳答案

这种行为是可以预期的。您只是在告诉NHibernate批量从数据库中获取两个集合,这是按照通知进行的。但是,您并没有告诉他们它们是相关的。 NH带有 future 的查询不会在执行实体后将它们放在一起,除非被告知要通过联接将它们放在一起。

如果您在没有 future 的情况下执行了单独的查询,则您不会期望父实体突然将子集合填满。基本上, future 允许您一次往返交易。如果查询恰好具有多个子集合的公共(public)根(例如,避免使用笛卡尔积),则NH能够将多个集合“组合”为一个实体。

不幸的是,与NH LINQ Api结合使用时,ToFuture()方法似乎在当前(NH 3.0或3.1)实现中带来了问题。在这种情况下,您可能需要使用QueryOver Api。

附带一提,我认为方法名称不合适。

编辑:问题编辑后,方法名称现在确定。

09-26 18:30