update multiple masivo framework c# entity-framework entity-framework-4 refresh dbcontext

multiple - update entity framework c#



Cómo actualizar DbContext (4)

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 actualiza mi DbContext :

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

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


Acabo de encontrar que el resultado Enumerable debe evaluarse porque el método Refresh obtiene como un 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);


En algunos casos, si una aplicación de terceros ha actualizado 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 a un objeto B.

La aplicación 1 carga un objeto A con A.ListB vacío. Aplicación 2 llena la colección A.ListB. La aplicación 1 recarga el objeto A.

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

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

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); }


Revisé 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 contexto db?


using System.Data.Entity.Core.Objects; using System.Data.Entity.Infrastructure; using System.Linq; namespace System.Data.Entity { public static class DbContextExtensions { /// <summary> /// Refresh non-detached entities /// </summary> /// <param name="dbContext">context of the entities</param> /// <param name="refreshMode">store or client wins</param> /// <param name="entityType">when specified only entities of that type are refreshed. when null all non-detached entities are modified</param> /// <returns></returns> 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<TEntity>(this DbContext dbContext, RefreshMode refreshMode) { return RefreshEntites(dbContext: dbContext, refreshMode: refreshMode, entityType: typeof(TEntity)); } } }