实体框架渴望加载EF4和EF6中的差异

时间:2014-05-03 15:01:33

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

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运行代码时的第一个代码相比,它为什么这么慢(非常非常慢)?这两个代码都禁用了LazyLoading。我知道可能有更好的编码方式使其加载更快,但我只是好奇为什么EF6的代码明显慢于EF4(对于这个问题)。或者这不是EF6中的等效代码吗?

1 个答案:

答案 0 :(得分:1)

更接近的等价物可能是:

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

如果.Entry设置为DetectChanges(默认为默认值),AutoDetectChangesEnabled方法会在内部调用true。取决于上下文中的实体数量和contacts自动更改检测的数量可能相当耗时,尤其是在循环中多次调用时。在EF 4和ObjectContext中没有AutoDetectChangesEnabled标记,并且当DbContext为{{AutoDetectChangesEnabled时,true API中的EF方法不会执行更改检测1}}。

如果能提高性能吗?我也会感兴趣。