Comment actualiser DbContext

Je souhaite actualiser toutes les entités de mon DbContext sans le recréer. J’ai essayé les DbContext suivantes et aucune d’entre elles n’a de sens:

 var context = ((IObjectContextAdapter)myDbContext).ObjectContext; var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEnsortinges( 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.Ensortinges()) { entry.State = EntityState.Unchanged; } this.Orm.ChangeTracker.DetectChanges(); 

Et le seul qui rafraîchit mon DbContext :

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

Mais c’est trop lent. Pouvez-vous m’aider à choisir le bon chemin?

Je viens de constater que le résultat Enumerable doit être évalué, car la méthode Refresh obtient en tant qu’object et ne l’évalue pas.

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

Et je préfère ce qui suit:

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

J’ai vérifié cela et ça marche 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); 

Êtes-vous sûr que c’est le même contexte de firebase database?

 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 .GetObjectStateEnsortinges(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)); } } } 

Dans certains cas, si une collection a été mise à jour par une application tierce, la collection peut ne pas être rechargée lors de l’actualisation de l’object de la collection.

J’ai eu le cas où j’avais un object A avec une relation multiple à un object B.

Application 1 charge un object A avec A.ListB vide. Application 2 remplit la collection A.ListB. L’application 1 recharge l’object A.

Avec la solution ci-dessus, A.ListB rest vide. Je devais recharger la collection A.ListB explicitement.

Voici un moyen générique de recharger toutes les collections:

 var context = ((IObjectContextAdapter)this).ObjectContext; // detach all added entities ChangeTracker.Ensortinges().Where(e => e.State == EntityState.Added).ToList().ForEach(e => e.State = EntityState.Detached); // select entities var refreshableObjects = ChangeTracker.Ensortinges().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); }