Obtenga la lista de objetos modificados dentro de Entity Framework 7

.net c# dbcontext entity-framework entity-framework-core

Pregunta

Estoy desconcertado: me actualicé a Entity Framework 7 y normalmente anulo los SaveChanges dentro de DbContext para poder obtener una lista de todos los objetos modificados antes de que cambie. En última instancia, tengo una secuencia de comandos que se activa y realiza un seguimiento de la versión anterior en una base de datos. En Entity Framework 6 obtendría los cambios del modelo así:

var oc = ((IObjectContextAdapter)this).ObjectContext;
var modifiedItems = oc.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Deleted);

List<ObjectStateEntry> ModifiedObjlist = modifiedItems.ToList();

Sin embargo, ahora que ObjectContext se elimina dentro de Entity Framework 7, estoy atascado, ¿cómo obtendría una lista de los objetos modificados dentro de Entity Framework 7?

Respuesta aceptada

Puedes usar DbContext.ChangeTracker

var modifiedEntries = context.ChangeTracker
       .Entries()
       .Where(x => x.State == EntityState.Modified)
       .Select(x =>x.Entity)
       .ToList();

Respuesta popular

El código de @dotctor puede no funcionar en algunos casos.

Hay ciertos casos en los que el rastreador de cambios puede no tener la información más reciente con respecto a las entidades gestionadas por el contexto, por lo que una entidad podría modificarse / agregarse / eliminarse sin que el rastreador de cambios lo sepa. Para evitar este caso, envolvería el código de @dotctor en el siguiente condicional:

if(context.ChangeTracker.HasChanges())
{
  ...
}


Resumen de Microsoft de ChangeTracker.HasChanges () :

Comprueba si se está rastreando entidades nuevas, eliminadas o modificadas, de modo que estos cambios se enviarán a la base de datos si se llama a DbContext.SaveChanges o DbContext.SaveChangesAsync. Tenga en cuenta que este método llama a ChangeTracker.DetectChanges a menos que ChangeTracker.AutoDetectChangesEnabled se haya establecido en false.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué