2009-02-26 23 views
36

Estoy creando una aplicación con ADO.NET Entity Framework.¿Cómo puedo ver los cambios pendientes de Entity Framework?

Puedo recorrer mi código línea por línea mientras se depura y ver SQL Server Profiler para cada consulta ejecutada, ¡pero no puedo deducir de dónde provienen todos esos comandos SQL!

A veces, cuando ejecuto SaveChanges(), Entity Framework realiza inserciones inesperadas y extrañas. A veces rompen la aplicación. No puedo entender lo que estoy haciendo para causarlos.

¿Cómo puedo controlar los cambios pendientes que hacen cola esperando una llamada SaveChanges()?

Respuesta

20

Tome un vistazo a

myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added) 

here.

+9

Si está utilizando un objeto DbContext continuación, tendrá que convertirlo a un IObjectContextAdapter antes de poder acceder al ObjectStateManager. Ejemplo: ((IObjectContextAdapter) dbcontext) .ObjectContext.ObjectStateManager – Corin

8

Para supervisar los eventos cuando se añaden a las entidades o elimina del gestor de estado, puede utilizar ObjectStateManagerChanged evento:

var ctx = new ModelContainer(); 

// ... 

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

Desde Entity Framework 5.0 DbContext tiene un ChangeTracker property que tiene todos los cambios pendientes. Al igual que en el ObjectStateManager puede obtener entidades en varios estados de la siguiente manera:

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

Gracias, parece que esta es la única respuesta correcta para EF5 + – Peter

+0

¡Parece que no puedo acceder a eso en Windows Inmediato! Obtengo [este error] (http://imgur.com/a/2CsQn). – Ciwan

+0

Bien, ¿hay alguna forma de obtener el SQL que EF intentará para esos cambios? –

2

Entity Framework 6 tiene un método para que, realmente útil.

dbContext.ChangeTracker.HasChanges() 

Ejemplo:

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