【问题标题】:Entity framework eager loading difference in EF4 AND EF6EF4 和 EF6 中的实体框架急切加载差异
【发布时间】:2014-05-03 15:01:32
【问题描述】:

EF6 中 EntityCollection.Load() 的等价物是什么?我目前正在阅读一本关于 EF4 的书,在其中一个示例中,它调用了 Load() 方法:

foreach (var contact in contacts)
{
    contact.Addresses.Load();
    Console.WriteLine(contact.Addresses.Count);
}

我正在使用 EF6 进行测试和查看互联网,这是我发现的有效方法:

foreach (var contact in contacts)
{
    context.Entry(contact).Collection(c => c.Addresses).Load();
    Console.WriteLine(contact.Addresses.Count());
}

但如果这是等价的,为什么与我使用 EF4 运行代码时的第一个代码相比如此慢(非常、非常慢)?两个代码都禁用了延迟加载。我知道可能有更好的编码方法可以使其加载速度更快,但我只是好奇为什么 EF6 的代码比 EF4 的代码慢得多(就此而言)。或者这不是 EF6 中的等效代码?

【问题讨论】:

  • 您到底想达到什么目标?为什么需要.Load()?这似乎是一个非常人为的场景 - 很难给出建议。
  • 我正在测试书中的代码示例。第一个代码块用于使用 Load() 方法(在 EF4 中工作)预先加载联系人地址。现在,我正在尝试在 EF6 中做同样的事情(使用 Load() 方法进行预加载),但是使用我使用的当前代码(第二个块),它可以工作但速度太慢。我想知道为什么,甚至是 EF6 中的 Load() 方法版本。
  • contact.Addresses.Load(); 在 EF6 中不起作用吗?
  • 我认为不是; IntelliSense 不会捡起它,而且地址是 EF6 的 ICollection
    类型,而 EF4 的 EntityCollection 类型。

标签: c# .net entity-framework eager-loading


【解决方案1】:

更接近的等价物可能是:

context.Configuration.AutoDetectChangesEnabled = false;
foreach (var contact in contacts)
{
    context.Entry(contact).Collection(c => c.Addresses).Load();
    Console.WriteLine(contact.Addresses.Count());
}

如果AutoDetectChangesEnabled 设置为true(默认情况下),.Entry 方法会在内部调用DetectChanges。根据上下文中实体的数量和contacts 的数量,自动更改检测可能相当耗时,尤其是在循环中多次调用时。在 EF 4 和 ObjectContext 中,没有 AutoDetectChangesEnabled 标志,并且当 AutoDetectChangesEnabledtrue 时,在 DbContext API 中没有像在 DbContext API 中那样执行更改检测。

如果这样可以提高性能,您可以试试吗?我也会感兴趣的。

【讨论】:

  • 嗨,Slauma - 我试过你写的东西,是的,它确实变得非常快。与 EF4 一起测试,EF4 仍然更快,但至少现在差异很小,几乎可以忽略不计(几乎)。虽然我仍然想知道为什么 EF4 更快。谢谢!
  • @g_b:啊,很高兴知道它确实有效!自动变更检测是DbContext 的一个难点。这里 (blog.oneunicorn.com/2012/03/10/…) 是关于它的 4 部分系列(第 2 部分列出了除 Entry 之外的其他方法受到影响)。
  • 是的,一旦您在回答中提到 DetectChanges,我已经找到该网站,将阅读它,再次感谢!
猜你喜欢
  • 1970-01-01
  • 2011-04-09
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2011-05-03
  • 2011-03-14
相关资源
最近更新 更多