¿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
Respuesta
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();
+1 por estar generalmente en el camino correcto, pero use' Any() ', not' Count()> 0'. –
Maldición, ¡solo lee tu blog sobre esto hoy! Gracias;) – Yakimych
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. –
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.
Comenzando con EF 6, hay context.ChangeTracker.HasChanges()
.
Respuesta más actualizada. – Zapnologica
A partir de 2016 esta es la respuesta, en mi humilde opinión. – ozgur
Esta es ahora la mejor respuesta que otros han mencionado. – Yokomoko
- 1. TFS 2010 - ¿Hay alguna forma de recuperar mis cambios después de haber hecho "Deshacer cambios pendientes"?
- 2. Dependiendo de los cambios pendientes en TFS
- 3. Cambios pendientes de Silly Visual Studio Pregunta
- 4. Mercurial: compruebe si la última extracción/actualización introdujo cambios
- 5. columna Compruebe si hay un valor único
- 6. Ruby: compruebe si hay un puerto abierto
- 7. php - compruebe si hay una guía válida
- 8. Compruebe si hay un módulo node.js disponible
- 9. Cómo realizar el equivalente TFS de 'Deshacer cambios pendientes'
- 10. TFS muestra los cambios pendientes con el estado "fusionar". Si los controlo, ¿cambiarán los archivos?
- 11. ¿Cómo puedo ver los cambios pendientes de Entity Framework?
- 12. Copia de cambios pendientes entre NSManagedObjectContexts con shared persistent store?
- 13. Mercurial dice "abortar: cambios no confirmados pendientes", no quiero cometer
- 14. SVN: mover los cambios pendientes a una nueva rama
- 15. Compruebe si existe tabla
- 16. guardar cambios html del cliente
- 17. Compruebe si existe un archivo/directorio: ¿hay una mejor manera?
- 18. Compruebe si hay 404 estados de error en jQuery
- 19. MySQL Compruebe si hay 3 o más consecutivos (específico) entradas
- 20. ASP.NET: compruebe si hay un evento de clic en page_load
- 21. Compruebe si una URL tiene http: // prefijo
- 22. JPA - guardar cambios sin persist() invocado
- 23. compruebe si NSNumber está vacío
- 24. Compruebe si los valores del formulario web han cambiado
- 25. BASH - Compruebe si existe PID
- 26. PowerShell analizar XML y guardar cambios
- 27. SVN: y bash: cómo saber si hay cambios no confirmados
- 28. Compruebe si "exec" está deshabilitado
- 29. jQuery: compruebe si existe imagen
- 30. En forzosa, ¿cómo elimino los cambios pendientes para los archivos NUEVOS/AÑADIDOS que no se enviaron?
¿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