使用EF加载巨大的实体树

时间:2009-07-06 13:43:48

标签: performance entity-framework mapping

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

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

  1. 使用一个巨大的包含电话
  2. 在手动迭代模型时使用多个包含调用
  3. 使用多个IsLoaded和Load调用
  4. 以下是2个选项

    的情况
    1. EF会创建一个巨大的查询,对数据库施加非常大的负担,然后再次映射模型。所以不是一个选择。

    2. 数据库被大量调用,但又有很多大问题。

    3. 同样,数据库被调用得更多,但这次只有很小的负载。

    4. 所有这些选择都会对性能造成沉重打击。我确实需要加载所有数据(绘图计算)。

      那我该怎么办?

      a)重操作=>重负荷=>没做什么 :) b)审查设计=>但怎么样? c)一个神奇的选择,将使所有这些问题消失

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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