7

给定一个使用 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 查询并访问数据库以获取每个孩子。为什么没有填充对象图?还是这是预期的行为?

4

1 回答 1

4

这种行为是意料之中的。您只是告诉 NHibernate 批量从数据库中获取两个集合,它正在按照说明进行操作。但是,您并没有告诉它它们是相关的。带有 Future 的 NH 查询在执行实体后不会将它们放在一起,除非它们被告知通过连接这样做。

如果您在没有 Futures 的情况下执行单独的查询,您不会期望 Parent 实体突然填充子集合。基本上,Futures 允许您在一次往返中运行事物。如果查询碰巧有一个带有多个子集合的公共根(例如,为了避免笛卡尔积),那么 NH 能够将多个集合“组合”成一个实体。

不幸的是加入了 NH LINQ Api,并且该ToFuture()方法似乎在当前(NH 3.0 或 3.1)实现中造成了问题。在这种情况下,您可能需要使用 QueryOver Api。

另一方面,我认为方法名称不合适。

编辑:编辑问题后,方法名称现在可以了。

于 2011-03-25T16:44:53.197 回答