2015-09-15 16 views
7

Tôi đang stumped - nâng cấp lên Entity Framework 7 và tôi thường ghi đè SaveChanges bên trong DbContext để có thể nhận được một danh sách tất cả các đối tượng được sửa đổi trước khi thay đổi. Cuối cùng, tôi có một tập lệnh kích hoạt phiên bản trước đó trong cơ sở dữ liệu. Trong Entity Framework 6 tôi sẽ nhận được những thay đổi mô hình như vậy:Lấy danh sách các đối tượng được sửa đổi trong Entity Framework 7

var oc = ((IObjectContextAdapter)this).ObjectContext; 
var modifiedItems = oc.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Deleted); 

List<ObjectStateEntry> ModifiedObjlist = modifiedItems.ToList(); 

Tuy nhiên bây giờ mà ObjectContext được lấy ra trong vòng Entity Framework 7, tôi gặp khó khăn, làm thế nào tôi bên Entity Framework 7 có được một danh sách các đối tượng sửa đổi?

+1

sử dụng 'context.ChangeTracker.Entries(). Where (x => x.State == ...)' – dotctor

+1

@dotctor thêm làm câu trả lời để tôi có thể chấp nhận câu trả lời đó –

Trả lời

5

Bạn có thể sử dụng DbContext.ChangeTracker

var modifiedEntries = context.ChangeTracker 
     .Entries() 
     .Where(x => x.State == EntityState.Modified) 
     .Select(x =>x.Entity) 
     .ToList(); 
+4

Làm cách nào để có được Thuộc tính được sửa đổi từ ChangeTracker –

0

đang @dotctor 's có thể không hoạt động trong một số trường hợp.

Có một số trường hợp mà trình theo dõi thay đổi có thể không có thông tin mới nhất liên quan đến các thực thể đang được quản lý theo ngữ cảnh, vì vậy thực thể có thể được sửa đổi/thêm/xóa mà không cần theo dõi thay đổi. Để tránh trường hợp này, tôi sẽ quấn mã 's @dotctor trong điều kiện sau đây:

if(context.ChangeTracker.HasChanges()) 
{ 
    ... 
} 


Microsoft Tóm tắt các ChangeTracker.HasChanges():

Kiểm tra nếu bất kỳ mới, xóa, hoặc thay đổi các thực thể đang được theo dõi sao cho những thay đổi này sẽ được gửi đến cơ sở dữ liệu nếu DbContext.SaveChanges hoặc DbContext.SaveChangesAsync được gọi. Lưu ý rằng phương thức này gọi ChangeTracker.DetectChanges trừ khi ChangeTracker.AutoDetectChangesEnabled được đặt thành false.

Các vấn đề liên quan