Kiểm tra xem có bất kỳ thay đổi nào đang chờ xử lý được lưu không


75

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?


Context.savechanges () không tự động kiểm tra điều này? Lý do im chào bán là tôi nghĩ rằng một vài người sẽ cố gắng làm những điều sau đây: if (db.ChangeTracker.HasChanges()) { await db.SaveChangesAsync(); }
Zapnologica

Câu trả lời:


61

Đ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();

12
+1 vì nói chung là đi đúng hướng, nhưng sử dụng Any(), không Count() > 0.
Craig Stuntz

Thật tuyệt - chỉ cần đọc bài đăng trên blog của bạn về điều này hôm nay! Cảm ơn;)
Yakimych

Lưu ý rằng EF không kiểm tra xem giá trị có thực sự khác không (đối với 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.
Matthieu Charbonnier

102

Bắt đầu với EF 6, có context.ChangeTracker.HasChanges().


3
Câu trả lời cập nhật nhất.
Zapnologica

1
Vào năm 2016, đây là câu trả lời, IMHO.
ozgur

Đây là câu trả lời tốt nhất như những người khác đã đề cập.
Yokomoko

Giải pháp gọn gàng! Cám ơn vì đã chia sẻ. Bạn có biết cách nắm bắt các thay đổi đúng lúc và đánh dấu biểu mẫu đã sửa đổi bằng "*" không? như: Form1 *
Rapunzo

43

Đố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.


4
Cảm ơn, câu trả lời được chấp nhận không phù hợp với tôi trong khi câu trả lời của bạn thì có (EF v.4.3).
Christian

1
EntityStatecho EntityState.Addedlà từ System.Data.Entityvà không từ System.Data.
Yuck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.