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中的等效代码吗?
答案 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}}。
如果能提高性能吗?我也会感兴趣。