正如Ladislav在评论中已经指出的那样,您需要禁用自动更改检测以提高性能:
context.Configuration.AutoDetectChangesEnabled = false;
默认情况下,DbContextAPI中启用了此更改检测。
DbContext行为与ObjectContextAPI之所以如此不同的原因是,启用自动更改检测后,与API的函数相比,API的内部DbContext调用更多。DetectChangesObjectContext
在这里,您可以找到DetectChanges默认情况下调用的那些函数的列表。他们是:
- 的
Add,Attach,Find,Local,或Remove成员DbSet
- 的
GetValidationErrors,Entry或SaveChanges成员DbContext
- 在
Entries对方法DbChangeTracker
特别是导致您体验不佳的Add呼叫DetectChanges。
与此形成对比的是,ObjectContextAPIDetectChanges仅自动调用,SaveChanges而不会自动调用,并且不会自动调用AddObject上面提到的其他相应方法。这就是为什么默认性能ObjectContext更快的原因。
他们为什么DbContext在这么多功能中引入了这种默认的自动更改检测功能?我不确定,但似乎认为禁用它并DetectChanges在适当时点手动调用是高级的,并且可以轻松地将细微的错误引入应用程序,因此请谨慎使用[it]。