【问题标题】:Loading a huge entity tree with EF使用 EF 加载巨大的实体树
【发布时间】:2010-11-08 09:25:58
【问题描述】:

我需要使用 Entity Framework 从数据库中加载一个现有 +/- 20 个表的模型。

所以可能有几种方法可以做到这一点:

  1. 使用一个巨大的 Include 调用
  2. 在手动迭代模型时使用多个 Includes 调用
  3. 使用多个 IsLoaded 和 Load 调用

这两个选项会发生什么

  1. EF 创建了一个巨大的查询,给数据库带来了非常沉重的负载,然后再次映射模型。所以不是一个真正的选择。

  2. 数据库被调用了很多次,又是相当大的查询。

  3. 再次调用数据库的次数更多,但这次负载很小。

所有这些选项都对性能影响很大。我确实需要加载所有这些数据(绘图计算)。

那我该怎么办?

a) 重操作 => 重负载 => 什么都不做 :) b) 审查设计 => 但如何? c) 一个神奇的选项,可以让所有这些问题消失

【问题讨论】:

  • 我需要进行 CAD 计算,这涉及访问模型的一大块(在特定节点下)。要知道特定项目应该在图纸上的什么位置,我需要知道它的父项在哪里,还需要知道它的类型和特征。这个逻辑适用于树中的所有项目......这有意义吗?如果不是,我会解释更多:)
  • 现在很有意义。 ;-)

标签: performance entity-framework mapping


【解决方案1】:

当您需要从缺乏不同的表中加载大量数据时,没有“神奇”的解决方案可以解决所有问题。但是除了您已经讨论过的内容之外,您还应该考虑投影。如果您不需要实体的每一个属性,那么投射您确实需要的信息通常会更便宜,即:

from parent in MyEntities.Parents
select new
{
    ParentName = ParentName,
    Children = from child in parent.Children
               select new
               {
                   ChildName = child.Name
               }
}

要记住的另一件事是,对于非常大的查询,编译查询的成本通常会超过执行它的成本。只有分析才能告诉您这是否是问题所在。如果这是问题所在,请考虑使用 CompiledQuery。

【讨论】:

  • 是的,我记得你之前关于投影的建议。但是,创建此模型的投影本身并不容易。另外,这也是一个很大的架构,所以我有点担心在使用这种方法时可能会出现新的问题。编译的成本确实也是一个非常冗长的操作(目前),所以我一定会研究 CompiledQuery 选项。谢谢
【解决方案2】:

您可以分析查询与更新的比率。如果您主要上传模型一次,那么其他所有内容都是查询,那么也许您应该将模型的 XML 表示形式存储在数据库中作为模型的“影子”。您应该能够相当快地一次读取整个 XML 列,或者您可以使用 XQuery 进行计算(或至少获取计算所需的值)。

这假定 SQL Server 2005 或更高版本。

【讨论】:

    【解决方案3】:

    您可以考虑将数据缓存在内存中,而不是每次都从数据库中获取。

    我会推荐企业库缓存应用程序块:http://msdn.microsoft.com/en-us/library/dd203099.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 2021-02-16
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多