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