Như đã được Ladislav chỉ ra trong nhận xét, bạn cần tắt tính năng phát hiện thay đổi tự động để cải thiện hiệu suất:
context.Configuration.AutoDetectChangesEnabled = false;
Tính năng phát hiện thay đổi này được bật theo mặc định trong DbContext
API.
Lý do tại sao DbContext
hoạt động rất khác với ObjectContext
API là nhiều chức năng của DbContext
API sẽ gọi DetectChanges
nội bộ hơn các chức năng của ObjectContext
API khi tính năng phát hiện thay đổi tự động được bật.
Tại đây, bạn có thể tìm thấy danh sách các hàm được gọi DetectChanges
theo mặc định. Họ đang:
- Các
Add
, Attach
, Find
, Local
, hoặc Remove
các thành viên trênDbSet
- Các
GetValidationErrors
, Entry
hoặc SaveChanges
các thành viên trênDbContext
- Các
Entries
phương pháp trênDbChangeTracker
Đặc biệt là Add
các cuộc gọi DetectChanges
chịu trách nhiệm về hiệu suất kém mà bạn gặp phải.
Tôi trái ngược với điều này, ObjectContext
API DetectChanges
chỉ gọi tự động trong SaveChanges
chứ không gọi trong AddObject
và các phương thức tương ứng khác được đề cập ở trên. Đó là lý do tại sao hiệu suất mặc định của ObjectContext
nhanh hơn.
Tại sao họ giới thiệu tính năng phát hiện thay đổi tự động mặc định này DbContext
trong rất nhiều chức năng? Tôi không chắc lắm, nhưng có vẻ như việc vô hiệu hóa nó và gọi DetectChanges
theo cách thủ công tại các điểm thích hợp được coi là nâng cao và có thể dễ dàng đưa các lỗi nhỏ vào ứng dụng của bạn, vì vậy hãy sử dụng [nó] một cách cẩn thận .