Có cách nào để tìm ra liệu có những thay đổi chưa được lưu trong ngữ cảnh thực thể của tôi, trong Khung thực thể không?
Câu trả lời:
Điều này có thể hoạt động (nếu bạn có những thay đổi nghĩa là các thực thể đã thêm, xóa và sửa đổi):
bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() +
context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() +
context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count()
) > 0;
Biên tập:
Cải tiến mã:
bool changesMade = context.
ObjectStateManager.
GetObjectStateEntries(EntityState.Added |
EntityState.Deleted |
EntityState.Modified
).Any();
Any()
, không Count() > 0
.
EntityState.Modified
). eq nếu bạn thay thế một giá trị bằng chính nó, EF sẽ trả về 1 modified object
. Bạn phải kiểm tra trước nếu giá trị khác nhau.
Bắt đầu với EF 6, có context.ChangeTracker.HasChanges()
.
Đối với những người bạn sử dụng EF 4+, đây là một giải pháp tương đương làm phương pháp mở rộng:
public static class DbContextExtensions {
public static Boolean HasPendingChanges(this DbContext context) {
return context.ChangeTracker.Entries()
.Any(e => e.State == EntityState.Added
|| e.State == EntityState.Deleted
|| e.State == EntityState.Modified);
}
}
Lưu ý rằng bạn không thể kết hợp các giá trị dưới dạng mặt nạ bit. Hàm đã GetObjectStateEntries()
xử lý logic cho bạn, nhưng LINQ sẽ không tạo ra kết quả thích hợp.
EntityState
cho EntityState.Added
là từ System.Data.Entity
và không từ System.Data
.
if (db.ChangeTracker.HasChanges()) { await db.SaveChangesAsync(); }