2009-02-26 10 views
36

Ich erstelle eine Anwendung mit dem ADO.NET Entity Framework.Wie kann ich die ausstehenden Änderungen des Entity Framework sehen?

Ich kann während des Debuggens Zeile für Zeile durch meinen Code gehen und SQL Server Profiler für jede ausgeführte Abfrage beobachten, aber ich kann nicht herausfinden, woher all diese SQL-Befehle kommen! Manchmal

wenn ich SaveChanges() ausführen, führt das Entity Framework unerwartet, seltsam EINSÄTZE. Sie brechen manchmal die Anwendung. Ich kann nicht herausfinden, was ich mache, um sie zu verursachen.

Wie kann ich die ausstehenden Änderungen überwachen, die in der Warteschlange auf einen Anruf SaveChanges() warten?

Antwort

20

Werfen Sie einen Blick auf

myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added) 

here.

+9

Wenn Sie ein DbContext Objekt verwenden dann müssen Sie es auf einen IObjectContextAdapter werfen, bevor Sie die Object zugreifen können. Beispiel: ((IObjectContextAdapter) dbcontext) .ObjectContext.ObjectStateManager – Corin

8

die Ereignisse zu überwachen, wenn Entitäten hinzugefügt oder aus dem Zustand Manager entfernt, Sie ObjectStateManagerChanged Ereignis verwenden können:

var ctx = new ModelContainer(); 

// ... 

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

Da Entity Framework 5.0 DbContext eine ChangeTracker property hat, die alle anstehenden Änderungen hat. Ähnlich wie die ObjectStateManager Sie können Objekte in verschiedenen Staaten erhalten wie folgt:

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

Danke, sieht aus wie dies ist die einzige richtige Antwort für EF5 + – Peter

+0

Ich kann nicht scheinen, auf das in der unmittelbaren Windows zuzugreifen! Ich bekomme [diesen Fehler] (http://imgur.com/a/2CsQn). – Ciwan

+0

Okay, gibt es eine Möglichkeit, die SQL zu erhalten, die EF für diese Änderungen versuchen wird? –

2

Entity Framework 6 hat eine Methode für das, wirklich nützlich.

dbContext.ChangeTracker.HasChanges() 

Beispiel:

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