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 DbContextAPI.
Lý do tại sao DbContexthoạt động rất khác với ObjectContextAPI là nhiều chức năng của DbContextAPI sẽ gọi DetectChangesnội bộ hơn các chức năng của ObjectContextAPI 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 DetectChangestheo mặc định. Họ đang:
- Các
Add, Attach, Find, Local, hoặc Removecác thành viên trênDbSet
- Các
GetValidationErrors, Entryhoặc SaveChangescác thành viên trênDbContext
- Các
Entriesphương pháp trênDbChangeTracker
Đặc biệt là Addcác cuộc gọi DetectChangeschị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, ObjectContextAPI DetectChangeschỉ gọi tự động trong SaveChangeschứ không gọi trong AddObjectvà 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 ObjectContextnhanh 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 DbContexttrong 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 DetectChangestheo 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 .