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());
}
该.Entry
方法在DetectChanges
内部调用ifAutoDetectChangesEnabled
设置为true
(默认情况下)。取决于上下文中实体的数量和contacts
自动更改检测的数量可能会非常耗时,尤其是在循环中多次调用时。在EF 4和ObjectContext
没有AutoDetectChangesEnabled
标志,并且因为它是在没有在如此多的EF的方法进行改变检测DbContext
的API时AutoDetectChangesEnabled
是true
。
您能否尝试改善性能?我也会很感兴趣。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句