62

¿Hay alguna forma de averiguar si hay cambios no guardados en el contexto de mi entidad, en Entity Framework?Compruebe si hay cambios pendientes para guardar

+0

¿context.savechanges() no comprueba esto automáticamente? La razón por la que estoy preguntando es que creo que algunas personas intentarán hacer lo siguiente: 'if (db.ChangeTracker.HasChanges()) {await db.SaveChangesAsync(); } ' – Zapnologica

Respuesta

57

Esto podría funcionar (si los cambios te refieres a añadir, eliminar y entidades modificado):

bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() + 
        context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() + 
        context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count() 
        ) > 0; 

Editar:

código mejorada:

bool changesMade = context. 
        ObjectStateManager. 
        GetObjectStateEntries(EntityState.Added | 
             EntityState.Deleted | 
             EntityState.Modified 
             ).Any(); 
+11

+1 por estar generalmente en el camino correcto, pero use' Any() ', not' Count()> 0'. –

+0

Maldición, ¡solo lee tu blog sobre esto hoy! Gracias;) – Yakimych

+0

Tenga en cuenta que EF no comprueba si el valor es realmente diferente (para el 'EntityState.Modified'). e.q. si reemplaza un valor por sí mismo, EF devolverá '1 objeto modificado'. Debe verificar de antemano si el valor es diferente. –

40

Para aquellos de ustedes utilizando EF 4+, aquí hay una solución equivalente como método de extensión:

public static class DbContextExtensions { 
    public static Boolean HasPendingChanges(this DbContext context) { 
     return context.ChangeTracker.Entries() 
         .Any(e => e.State == EntityState.Added 
          || e.State == EntityState.Deleted 
          || e.State == EntityState.Modified); 
    } 
} 

Tenga en cuenta que no puede combinar los valores como una máscara de bits. La función GetObjectStateEntries() manejó la lógica por usted, pero LINQ no producirá los resultados adecuados.

+4

Gracias, la respuesta aceptada no funcionó para mí, mientras que la suya sí (EF v.4.3). – Christian

+1

'EntityState' para' EntityState.Added' es de 'System.Data.Entity' y no de' System.Data'. – Yuck

68

Comenzando con EF 6, hay context.ChangeTracker.HasChanges().

+1

Respuesta más actualizada. – Zapnologica

+1

A partir de 2016 esta es la respuesta, en mi humilde opinión. – ozgur

+0

Esta es ahora la mejor respuesta que otros han mencionado. – Yokomoko

Cuestiones relacionadas