14

Comment mettre à jour TOUTES les entités sales à partir du magasin de données et réinitialiser leurs valeurs modifiées à la valeur de stockage d'origine? La méthode ObjectContext.Refresh nécessite comme paramètre les entités à rafraîchir.ObjectContext.Refresh()?

Répondre

16

Ce qui suit fonctionne habituellement:

Context.Refresh(RefreshMode.StoreWins, _ 
    Context.ObjectStateManager.GetObjectStateEntries()) 

Il provoque parfois des problèmes avec EntityRelations. Regardez mon commentaire pour plus de détails.

+0

Cela m'a juste sauvé beaucoup de lignes de code marchant le graphique d'objet moi-même. –

+0

Il ya un bug, s'il vous plaît jeter un oeil: http://stackoverflow.com/questions/1757872/undelete-an-entity-marked-as-entitystate-delete – Shimmy

+0

Parfois, vous souhaitez mettre à jour même les éléments inchangés, cuz vous voulez les rafraîchir par rapport aux changements effectués dans la base de données par d'autres clients. – Shimmy

0

Si vous souhaitez réinitialiser TOUTES les modifications, vous pouvez définir le ObjectContext sur null et le ré-instancier.

Je crois que cela permettra d'atteindre ce que vous voulez.

Bonté,

Dan

+3

Je suppose que vous travaillez avec ASP .NET, donc c'est facile pour vous de le dire, j'utilise une instance de contexte de long cycle de vie. – Shimmy

0

Nous utilisons ceci:

return Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted 
System.Data.EntityState.Modified).All(ose 
    => { 
    if(ose.Entity != null) 
     Context.Refresh(RefreshMode.StoreWins, ose.Entity); 
     return true; 
    }); 

Où "Contexte" est le contexte pour se rafraîchir. Nous filtrons par changement d'état et d'entités pour éviter de nouvelles entités et relations.

+0

Ce n'est pas mauvais, mais ça ne marchera pas pour les relations. – Shimmy

10

Vous pouvez utiliser ce code:

public void RefreshAll() 
{ 
    // Get all objects in statemanager with entityKey 
    // (context.Refresh will throw an exception otherwise) 
    var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(
               EntityState.Deleted 
               | EntityState.Modified 
               | EntityState.Unchanged) 
             where entry.EntityKey != null 
             select entry.Entity); 

    context.Refresh(RefreshMode.StoreWins, refreshableObjects); 
} 

J'ai écrit un post sur la façon de RefreshAll() et rafraîchir le contexte dans d'autres façons:

http://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/

+0

Cela lèvera une exception si vous avez ajouté des éléments. Ajoutez-le avant de corriger: 'var addedEntries = context.ObjectStateManager.GetObjectStateEntries (EntityState.Added) .ToList(); addedEntries.ForEach (entry => entry.Delete()); ' – AncientSyntax

+0

@AncientSyntax Vous avez raison à propos de l'exception. En fait, si vous y pensez, cela n'a aucun sens d'essayer de rafraîchir une entité ajoutée. J'ai modifié la réponse supprimant l'EntityState.Added du code. Dans la solution que vous proposez, vous êtes en train de supprimer l'entité ajoutée, donc rien ne sera ajouté. –

+0

Est-ce lié à la version de SQL, donc il fonctionne quand il s'exécute sur un serveur SQL 12.0 mais 11.0? – jcubero