繁体   English   中英

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

[英]Entity framework eager loading difference in EF4 AND EF6

什么是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中的等效代码?

更接近的等效项可能是:

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内部调用DetectChanges 根据上下文中实体的数量和contacts的数量,自动更改检测可能会非常耗时,尤其是在循环中多次调用时。 在EF 4和ObjectContext ,没有AutoDetectChangesEnabled标志,并且当AutoDetectChangesEnabledtrue时,在DbContext API中没有像在DbContext API中那样执行更改检测。

您能否尝试改善性能? 我也会很感兴趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM