给定一个使用 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() 时,我看到批次穿过电线并显示在探查器中。
问题是,在枚举集合时,它仍然向数据库发送一次性查询
Eg.
for each (Kid kid in Dad.Kids) // This seems to hit the database
{
Teach(kid);
}
发送 SQL 查询并访问数据库以获取每个孩子。为什么对象图没有填充?或者这是预期的行为?
这种行为是可以预料的。您只需告诉 NHibernate 从数据库中批量获取两个集合,它就会按照指示执行操作。然而,你并没有告诉它它们是相关的。带有 Future 的 NH 查询在执行后不会将实体放在一起,除非它们被告知通过连接来这样做。
如果您在没有 Future 的情况下执行单独的查询,您不会期望父实体突然填充子集合。基本上,Futures 允许你在一个往返中运行一些东西。如果查询碰巧与多个子集合有一个共同的根(例如,为了避免笛卡尔积),则 NH 能够将多个集合“组合”为一个实体。
不幸的是,与 NH LINQ Api 和ToFuture()
方法似乎在当前(NH 3.0 或 3.1)实现中提出了问题。在这种情况下,您可能需要使用 QueryOver Api。
顺便说一句,我认为方法名称不合适。
编辑:编辑问题后,方法名称现在可以了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)