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