2009-02-26 17 views
36

Sto creando un'applicazione con ADO.NET Entity Framework.Come posso vedere le modifiche in sospeso di Entity Framework?

È possibile scorrere il codice riga per riga durante il debug e controllare SQL Server Profiler per ogni query eseguita, ma non riesco a capire da dove provengano tutti quei comandi SQL!

A volte quando eseguo SaveChanges(), Entity Framework esegue INSERTI strani e inattesi. A volte interrompono l'applicazione. Non riesco a capire cosa sto facendo per causarli.

Come posso monitorare le modifiche in sospeso che si accodano in attesa di una chiamata SaveChanges()?

risposta

20

Date un'occhiata a

myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added) 

here.

+9

Se si utilizza un oggetto DbContext allora avrete bisogno di gettare a un IObjectContextAdapter prima di poter accedere al ObjectStateManager. Esempio: ((IObjectContextAdapter) dbcontext) .ObjectContext.ObjectStateManager – Corin

8

Per monitorare gli eventi quando entità vengono aggiunti o rimossi dal manager dello Stato, è possibile utilizzare ObjectStateManagerChanged evento:

var ctx = new ModelContainer(); 

// ... 

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

Dal Entity Framework 5.0 DbContext ha un ChangeTracker property che ha tutte le modifiche in sospeso. Simile al ObjectStateManager è possibile ottenere entità in vari stati come segue:

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

Grazie, sembra che questa sia l'unica risposta corretta per EF5 + – Peter

+0

Non riesco ad accedervi nell'Immediate Windows! Ottengo [questo errore] (http://imgur.com/a/2CsQn). – Ciwan

+0

Ok, c'è un modo per ottenere l'SQL che EF sta per tentare per queste modifiche? –

2

Entity Framework 6 ha un metodo per questo, veramente utile.

dbContext.ChangeTracker.HasChanges() 

Esempio:

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