2010-02-25 5 views
14

Nous sommes le chargement des données de db:Comment rafraîchir le cache ObjectContext à partir de db?

var somethings = Context.SomethingSet.ToList(); 

Alors quelqu'un annule ou ajoute des lignes en dehors de leur contexte. Hors contexte a encore des objets supprimés en cache, car il ne sait pas qu'ils ont été supprimés. Même si j'appelle Context.SomethingSet.ToList(), notre contexte contient toujours des objets supprimés et les propriétés de navigation ne sont pas correctes.

Quelle est la meilleure méthode pour rafraîchir l'ensemble complet de la base de données?

Répondre

18

La méthode Refresh est ce que vous cherchez:

Context.Refresh(RefreshMode.StoreWins, somethings); 
+1

J'ai un peu changé de question. Je dois appeler 'Context.Refresh (RefreshMode.StoreWins, somethings)' en premier et 'var somethings = Context.SomethingSet.ToList()' pour obtenir des lignes ajoutées, car refresh ne les ajoutera pas. Je viens de remarquer dans le profileur que l'actualisation va dans une requête, donc la performance est assez bonne. Merci. – LukLed

10

Le contexte de données EF est une implémentation du modèle Unité de travail. En tant que tel, il n'est PAS conçu pour rester au-delà de l'unité de travail en cours. Une fois que votre travail est terminé, vous vous attendez à ce que votre contexte de données soit ignoré.

Il s'agit d'une décision de conception fondamentale pour EF v1, EF v4 et LINQ to SQL. À moins d'avoir des schémas d'utilisation de données très spécifiques et de nombreux volumes de mémoire, vous devriez éviter de conserver vos contextes de données plus longtemps que nécessaire pour compléter votre unité de travail.

http://sdesmedt.wordpress.com/2009/02/18/unit-of-work-pattern/

http://takacsot.freeblog.hu/Files/martinfowler/unitOfWork.html

+1

Je savais que quelqu'un me donnerait cette réponse :) Ne vous inquiétez pas. J'utilise un ObjectContext par requête, mais j'ai un contexte qui est utilisé pour mettre en cache certaines données. Il est utilisé uniquement pour la lecture. Mais c'est bon tu as remarqué. – LukLed

+0

Eh bien, heureux que vous vous débarrassiez de vos contextes. : D Je ne peux plus compter combien de fois je vois des gens essayer de garder leurs contextes d'objets pour toujours. Ils essaient de résoudre un problème perçu (une performance supposée), tout en créant simultanément une douzaine de problèmes plus graves qui nuisent également à la performance à long terme. J'essaie d'écraser ce comportement chaque fois que je le rencontre. ; P – jrista

1

Pour les propriétés virtuelles Recharger ne vous aide pas. Je dois le détacher et le recharger

public T Reload<T>(T entity) where T : class, IEntityId 
{ 
    ((IObjectContextAdapter)_dbContext).ObjectContext.Detach(entity); 
    return _dbContext.Set<T>().FirstOrDefault(x => x.Id == entity.Id); 
} 
Questions connexes