2009-02-26 32 views
36

Tôi đang tạo một ứng dụng với ADO.NET Entity Framework.Làm cách nào tôi có thể thấy các thay đổi đang chờ xử lý của Khung thực thể?

Tôi có thể thực hiện từng bước một trong khi gỡ lỗi và xem SQL Server Profiler cho mỗi truy vấn được thực thi, nhưng tôi không thể tìm ra tất cả các lệnh SQL này đến từ đâu!

Thỉnh thoảng khi tôi thực thi SaveChanges(), Khuôn khổ thực thể thực hiện các lỗi INSERTS không mong đợi. Họ đôi khi phá vỡ các ứng dụng. Tôi không thể hiểu được tôi đang làm gì để gây ra chúng.

Làm cách nào để giám sát các thay đổi đang chờ xử lý đang chờ đợi cuộc gọi SaveChanges()?

Trả lời

20

Hãy xem

myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added) 

here.

+9

Nếu bạn đang sử dụng một đối tượng DbContext sau đó bạn sẽ cần phải cast nó vào một IObjectContextAdapter trước khi bạn có thể truy cập vào ObjectStateManager. Ví dụ: ((IObjectContextAdapter) dbcontext) .ObjectContext.ObjectStateManager – Corin

8

Theo dõi các sự kiện khi thực thể được thêm vào hoặc ra khỏi quản lý nhà nước, bạn có thể sử dụng ObjectStateManagerChanged sự kiện:

var ctx = new ModelContainer(); 

// ... 

ctx.ObjectStateManager.ObjectStateManagerChanged += (sender, e) => 
{ 
    Trace.WriteLine(string.Format("{0}, {1}", e.Action, e.Element)); 
}; 
36

Kể từ Entity Framework 5.0 DbContextChangeTracker property trong đó có tất cả các thay đổi chưa giải quyết. Tương tự như các ObjectStateManager bạn có thể nhận được các thực thể trong trạng thái khác nhau như sau:

myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Added); 
myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted); 
myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Modified); 
+3

Cảm ơn, có vẻ như đây là câu trả lời đúng cho EF5 + – Peter

+0

Tôi dường như không thể truy cập nó trong Windows ngay lập tức! Tôi nhận được [lỗi này] (http://imgur.com/a/2CsQn). – Ciwan

+0

Được rồi, có cách nào để lấy SQL mà EF sẽ cố gắng cho những thay đổi đó không? –

2

Entity Framework 6 có một phương pháp cho rằng, thực sự hữu ích.

dbContext.ChangeTracker.HasChanges() 

Ví dụ:

if (dbContext.ChangeTracker.HasChanges()) 
{ 
    db.SaveChanges(); 
} 
Các vấn đề liên quan