2009-02-26 5 views
36

Tworzę aplikację z ADO.NET Entity Framework.Jak mogę zobaczyć zmiany w Entity Framework?

Potrafię przeglądać mój kod wiersz po wierszu podczas debugowania i oglądania programu SQL Server Profiler dla każdego wykonywanego zapytania, ale nie wiem, skąd pochodzą wszystkie te polecenia SQL!

Czasami, gdy wykonuję SaveChanges(), Entity Framework wykonuje nieoczekiwane, dziwne WKŁADKI. Czasami łamią aplikację. Nie wiem, co robię, żeby je wywołać.

Jak mogę monitorować oczekujące zmiany oczekujące na kolejkę oczekującą na wywołanie SaveChanges()?

Odpowiedz

20

Spójrz na

myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added) 

here.

+9

Jeśli używasz obiektu DbContext wtedy będziesz musiał oddać go do IObjectContextAdapter zanim będzie można uzyskać dostęp do ObjectStateManager. Przykład: ((IObjectContextAdapter) dbcontext) .ObjectContext.ObjectStateManager – Corin

8

Aby monitorować zdarzenia, gdy podmioty są dodawane lub usuwane z kierownika państwowej, można użyć ObjectStateManagerChanged zdarzenie:

var ctx = new ModelContainer(); 

// ... 

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

Od Entity Framework 5.0 DbContext ma ChangeTracker property który ma wszystkie zmiany. Podobny do ObjectStateManager można uzyskać podmioty w różnych stanach, co następuje:

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

Dzięki, wygląda na to, że jest to jedyna poprawna odpowiedź dla EF5 + – Peter

+0

Nie mogę uzyskać dostępu do tego w bezpośrednim systemie Windows! Dostaję [ten błąd] (http://imgur.com/a/2CsQn). – Ciwan

+0

Okay, czy istnieje sposób na uzyskanie kodu SQL, który EF będzie próbował wprowadzić te zmiany? –

2

Entity Framework 6 ma sposób, że naprawdę pożytecznego.

dbContext.ChangeTracker.HasChanges() 

Przykład:

if (dbContext.ChangeTracker.HasChanges()) 
{ 
    db.SaveChanges(); 
}