【问题标题】:NHibernate Future Object Graph Many QueriesNHibernate 未来对象图 许多查询
【发布时间】:2011-03-25 16:15:13
【问题描述】:

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

【问题讨论】:

  • 这是一些令人不安的代码。

标签: sql nhibernate batch-file future


【解决方案1】:

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

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

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

顺便说一句,我认为方法名称不合适。

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

【讨论】:

  • 你很聪明。谢谢我最近看到很多人在寻找这种情况的答案。
  • 可以在此处找到解决方案的示例:stackoverflow.com/questions/5266180/…
  • 查询碰巧有一个共同的根 - 请说明您如何设置这个共同的根。
  • @JonathanO 我不太确定你指的是什么。能详细点吗?
  • @FlorianLim 我认为 JonathanO 指的是“如果查询碰巧有一个带有多个子集合的共同根(例如,为了避免笛卡尔积),那么 NH 能够将多个集合“组合”成一个实体。”他想知道如何设置。从它的声音来看,这不能通过 NHibernate 的 LINQ API 来完成。这是不幸的。 v3.3 中似乎也是这种情况(这就是我发现这个问题的方式。)谁能确认它在 3.3 中仍然是一个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 2011-06-09
  • 2011-10-15
相关资源
最近更新 更多