当在数据库优先的场景中使用 DbContext 时,我发现与 ObjectContext 相比,添加和删除实体非常慢。如果添加 2000 个实体并在最后保存更改,DbContext 比 ObjectContext 慢 3 到 5 倍(顺便说一句:我知道使用 SqlBulkCopy 添加大量实体会更好,但这不是重点)。如果每次添加后保存更改,DbContext 仍然慢近两倍。当涉及到删除时,情况甚至变得更糟:在所有实体删除结束时保存时,DbContext 比 ObjectContext 慢大约 18 倍。
我使用了高度开发的测试应用程序来比较数据库访问技术和一个小型控制台应用程序来进行双重检查。两者都显示使用 DbContext 添加和删除实体的不良结果。以下是控制台应用程序的结果:
Inserting 2000 entities via DbContext saving changes at the end: 2164ms
Inserting 2000 entities via ObjectContext saving changes at the end: 457ms
Inserting 2000 entities via DbContext saving changes after each object addition: 8420ms
Inserting 2000 entities via ObjectContext saving changes after each object adding: 4857ms
Inserting 2000 entities via DbContext using a new DbContext for each object addition: 4018ms
Deleting 2000 entities via DbContext saving changes at the end: 4794ms
Deleting 2000 entities via ObjectContext saving changes at the end: 261ms
Deleting 2000 entities via DbContext saving changes after each object deletion: 25536ms
Deleting 2000 entities via ObjectContext saving changes after each object deletion: 2110ms
我尝试在 VC 2010 中使用 EF 4.3,在 VS 11 中使用 EF 5.0 Beta 2,结果几乎相同。我使用了“EF 4.x POCO Entity Generator for C#”、“EF 4.x DbContext Generator for C#”和“EF 5.x DbContext Generator for C#”提供的 T4 模板。
可能出了什么问题?根据测试结果,我永远不会在必须添加或删除实体的应用程序中使用 DbContext(不幸的是,这使得 DbContext 对我来说无法使用)。
我将控制台测试应用程序放在我的 Web 服务器上:EF 4.3 DbContext Test , EF 5.0 DbContext Test
如有任何想法/更正,我们将不胜感激。
最佳答案
尝试将其添加到您的 DbContext 测试中:
dbContext.Configuration.AutoDetectChangesEnabled = false;
// Now do all your changes
dbContext.ChangeTracker.DetectChanges();
dbContext.SaveChanges();
并尝试再次运行测试。
DbContext API 中存在一些架构更改,每次您从上下文中添加
、附加
或删除
任何内容时,它都会检查实体中的更改。在 ObjectContext API 中,此检测仅在您触发 SaveChanges
时运行。对于大多数常见场景来说这是更好的解决方案,但对于海量数据处理需要特殊处理。
关于entity-framework - DbContext添加和删除时很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10103310/