Cómo actualizar DbContext

Quiero actualizar todas las entidades de mi DbContext sin DbContext , intenté lo siguiente y ninguna de ellas tiene sentido:

 var context = ((IObjectContextAdapter)myDbContext).ObjectContext; var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries( EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged) where entry.EntityKey != null select entry.Entity); context.Refresh(RefreshMode.StoreWins, refreshableObjects); //....................................................................... foreach (var entry in this.Orm.ChangeTracker.Entries()) { entry.State = EntityState.Unchanged; } this.Orm.ChangeTracker.DetectChanges(); 

Y el único que refresca mi DbContext :

 foreach (var i in this.Orm.ChangeTracker.Entries()) i.Reload(); 

Pero es muy lento. ¿Puedes ayudarme a elegir el camino correcto?

Acabo de encontrar que el resultado de Enumerable debe evaluarse porque el método Refresh obtiene como objeto y no lo evalúa.

 var context = ((IObjectContextAdapter)myDbContext).ObjectContext; var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries( EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged) where entry.EntityKey != null select entry.Entity).ToList(); context.Refresh(RefreshMode.StoreWins, refreshableObjects); 

Y prefiero lo siguiente:

 var refreshableObjects = myDbContext.ChangeTracker.Entries().Select(c=>c.Entity).ToList(); context.Refresh(RefreshMode.StoreWins, refreshableObjects); 

Verifiqué esto y la identificación funciona bien:

 //Search Box box = dbContext.Boxes.FirstOrDefault(x => x.BoxId == 45); //breakpoint here, change Name of Box by sql management studio //Refresh var context = ((IObjectContextAdapter)dbContext).ObjectContext; context.Refresh(System.Data.Entity.Core.Objects.RefreshMode.StoreWins, box); //Check refresh and if it is in context box = dbContext.Boxes.FirstOrDefault(x => x.BoxId == 45); 

¿Estás seguro de que es el mismo db-context?

 using System.Data.Entity.Core.Objects; using System.Data.Entity.Infrastructure; using System.Linq; namespace System.Data.Entity { public static class DbContextExtensions { ///  /// Refresh non-detached entities ///  /// context of the entities /// store or client wins /// when specified only entities of that type are refreshed. when null all non-detached entities are modified ///  public static DbContext RefreshEntites(this DbContext dbContext, RefreshMode refreshMode, Type entityType) { //https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/ var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; var refreshableObjects = objectContext.ObjectStateManager .GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged) .Where(x => entityType == null || x.Entity.GetType() == entityType) .Where(entry => entry.EntityKey != null) .Select(e => e.Entity) .ToArray(); objectContext.Refresh(RefreshMode.StoreWins, refreshableObjects); return dbContext; } public static DbContext RefreshAllEntites(this DbContext dbContext, RefreshMode refreshMode) { return RefreshEntites(dbContext: dbContext, refreshMode: refreshMode, entityType: null); //null entityType is a wild card } public static DbContext RefreshEntites(this DbContext dbContext, RefreshMode refreshMode) { return RefreshEntites(dbContext: dbContext, refreshMode: refreshMode, entityType: typeof(TEntity)); } } } 

En algunos casos, si una aplicación de terceros actualizó una colección, es posible que la colección no se vuelva a cargar al actualizar el objeto de la colección.

Tuve el caso en el que tenía un objeto A con una relación de uno a muchos con un objeto B.

La aplicación 1 carga un objeto A con A.ListB vacía. La aplicación 2 llena la colección A.ListB. La aplicación 1 vuelve a cargar el objeto A.

Con la solución anterior, A.ListB permanece vacío. Tuve que volver a cargar la colección A.ListB explícitamente.

Aquí hay una forma genérica de tener todas las colecciones cargadas:

 var context = ((IObjectContextAdapter)this).ObjectContext; // detach all added entities ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList().ForEach(e => e.State = EntityState.Detached); // select entities var refreshableObjects = ChangeTracker.Entries().Select(e => e.Entity).ToList(); // refresh each refreshable object foreach (var @object in refreshableObjects) { // refresh each collection of the object context.ObjectStateManager.GetRelationshipManager(@object).GetAllRelatedEnds().Where( r => r.IsLoaded).ToList().ForEach( c => c.Load() ); // refresh the object context.Refresh(RefreshMode.StoreWins, @object); }