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
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.
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
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
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.
Ce n'est pas mauvais, mais ça ne marchera pas pour les relations. – Shimmy
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:
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
@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é. –
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
Cela m'a juste sauvé beaucoup de lignes de code marchant le graphique d'objet moi-même. –
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
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