在添加和删除时,DbContext非常慢
在数据库优先的场景中使用DbContext时,我发现添加和删除实体与ObjectContext相比非常慢。 如果添加2000个实体并在最后保存更改,DbContext比ObjectContext慢3到5倍(顺便说一下:我知道使用SqlBulkCopy添加大量实体会更好,但这不是重点)。 如果在每次添加之后保存更改,则DbContext仍然接近两倍。 当涉及到删除它甚至会变得更糟:当在所有实体删除的末尾保存时,DbContext比ObjectContext慢大约18倍。
我把我用来比较数据库访问技术和小型控制台应用程序的高度开发的testing应用程序进行仔细检查。 两者都显示使用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,结果几乎相同。 我使用了“用于C#的EF 4.x POCO实体生成器”,“用于C#的EF 4.x DbContext生成器”和“用于C#的EF 5.x DbContext生成器”提供的T4模板。
什么可能是错的? 根据testing结果,我绝对不会在需要添加或删除实体的应用程序中使用DbContext(不幸的是DbContext对我来说是不可用的)。
我把我的Web服务器上的控制台testing应用程序: EF 4.3 DbContexttesting , EF 5.0 DbContexttesting
任何想法/更正赞赏。
尝试添加到您的DbContexttesting:
dbContext.Configuration.AutoDetectChangesEnabled = false; // Now do all your changes dbContext.ChangeTracker.DetectChanges(); dbContext.SaveChanges();
并尝试再次运行您的testing。
DbContext API中有一些体系结构更改,每次Add
, Attach
或Delete
上下文中的任何内容时,都会检查实体中的更改。 在ObjectContext API中,此检测仅在触发SaveChanges
时才运行。 对于大多数常见的情况来说,这是更好的解决scheme,但是它需要特殊处理大量数据处
在EF6中 ,您现在可以使用DbSet上的AddRange和RemoveRange 。
从链接到文档:
请注意,如果AutoDetectChangesEnabled设置为true(这是默认设置),那么DetectChanges将在添加,删除任何实体之前调用一次,不会再被调用。 这意味着,在某些情况下,{Add,Remove} Range可能比多次调用{Add,Remove}要好得多。