Arthur Vickers xác định quy tắc khi DetectChanges
không cần phải được gọi (thậm chí không trước SaveChanges
) in this blog post:
Không gọi mã EF sẽ rời khỏi bối cảnh trong một tiểu bang nơi DetectChanges cần phải được gọi nếu nó không cần phải được gọi là trước đây.
Về Thêm và Xóa đây là những "mã EF" phương pháp vì bạn gọi Add
hoặc Delete
hoặc bạn thiết lập trạng thái của context.Entry(entity).State
để Added
hay Deleted
. Vì vậy, nếu bạn chỉ cần lặp qua một loạt các entites và thêm hoặc xóa chúng thì bạn không cần phải gọi DetectChanges
cả.
Liên quan đến Chỉnh sửa đó là, tôi tin rằng, một chút tinh tế hơn. Khi bạn cập nhật các đối tượng bằng cách sử dụng một trong hai ...
context.Entry(entity).CurrentValues.SetValues(someObject);
... hoặc bằng cách sử dụng API tài sản của DbContext
...
context.Entry(entity).Property(e => e.SomeProperty).CurrentValue = someValue;
... sau đó bạn không cần phải DetectChanges
(thậm chí không phải trước SaveChanges
) hoặc bởi vì đây là một lần nữa gọi vào "mã EF".
Nếu bạn chỉ cần thay đổi giá trị tài sản của một thực thể giống như ...
entity.SomeProperty = someValue;
... thì quy tắc thứ hai in the same blog post liên kết ở trên được áp dụng:
Bất cứ lúc nào mà không EF thay đổi mã bất kỳ giá trị tài sản nào của một thực thể hoặc đối tượng phức tạp thì có thể cần phải gọi DetectChanges.
Và tôi nghĩ rằng bạn cần trên thực tế chỉ có một cuộc gọi duy nhất để DetectChanges
trước SaveChanges
nếu bạn chỉ cần vòng lặp thông qua một số đối tượng, tải chúng vào hoặc đính kèm chúng vào bối cảnh và thay đổi một số (vô hướng và phức tạp) giá trị tài sản .
Nếu bạn làm những thứ phức tạp hơn (có thể thay đổi mối quan hệ? Hoặc cái gì khác?) Cách tiếp cận của bạn có thể không an toàn nữa vì
AutoDetectChanges
sẽ không được thực hiện trong cách thức mà nó là gì và gọi nhiều phương pháp EF nếu nó sẽ là chỉ cần một lần ngay trước khi SaveChanges
nó được đề cập in the same blog post một lần nữa rằng
Nếu mã làm thay đổi thay đổi các thuộc tính của các đối tượng thay vì chỉ gọi Add or Đính kèm, sau đó, bởi Quy tắc 2, DetectChanges sẽ cần phải được gọi, ít nhất là một phần của SaveChanges và có thể cũng trước sau đó.
(Nêu bật từ tôi)
Đáng tiếc là tôi không biết một ví dụ về mã mà sẽ hiển thị khi gọi DetectChanges
ở những giai đoạn sớm hơn ngay trước SaveChanges
là cần thiết. Nhưng vì điểm 1 ở trên tôi chắc chắn rằng các ví dụ như vậy tồn tại.
không chắc chắn 100% nếu nó làm bất kỳ điều gì lạ trong nền, nhưng tôi đã sử dụng một cách tiếp cận tương tự mà không tìm thấy bất kỳ tác dụng phụ xấu – Thewads