Est-il un moyen de réinitialiser un DbContext sans disposer et reinstantiating?
J'ai récemment refait une application WPF, de sorte qu'il n'est plus encapsule chaque utilisation de la DbContext dans un using
clause (voir cette question). Au lieu de cela, mon application utilise le même DbContext singleton dans l'ensemble.
Cela fonctionne très bien, sauf un petit problème. J'ai une routine qui recrée la base de données à partir de zéro et insère des données par défaut. Cette routine utilise ADO.NET directement (pas le DbContext), de sorte que le DbContext est pas au courant que la base de données est maintenant complètement différente.
Est-il une méthode pour réinitialiser le DbContext sans disposer? Je voudrais éviter l'élimination, si possible, parce que ce serait briser plusieurs références à l'origine de singleton dans toute l'application.
OriginalL'auteur devuxer | 2011-04-13
Vous devez vous connecter pour publier un commentaire.
Je n'étais pas en mesure de venir avec une méthode pour réinitialiser le mondial DbContext. J'ai pu résoudre mon problème, cependant, par l'injection d'un
DbContextLocator
dans l'une des classes qui a besoin d'un DbContext au lieu de passer le DbContext.Mon objectif était de maintenir un mondial DbContext, mais lui permettre d'être réinitialisé à chaque fois que nécessaire (par exemple après un reconstruire la base de données ou à l'importation).
Ma solution utilise une classe de base abstraite et concrète de la classe.
De La Classe De Base
De La Classe De Béton
Utilisation
Obtenez le courant DbContext:
Réinitialiser le DbContext:
Modifier
Basé sur Shimmy commentaires, j'ai fait
DbContextLocatorBase
dans un générique. (Je suis aussi maintenant la mise en œuvre deIDisposable
.)De La Classe De Base
De la Classe de béton (facultatif, depuis la classe de base n'est plus abstrait)
DbContextLocator
une classe générique, c'est à direDbContextLocator<TContext> where TContext : DbContext
, alors vous n'avez pas à faire une classe dérivée, ou vous pouvez faire la classe dérivée juste pour réduire la verbosité, sans le déclarer quoi que ce soit, voir l'exemple iciBonne idée...je suppose que je n'ai jamais optimisé à ce point car je ne m'ont tendance à écrire l'une des classes de béton par projet.
Une fois que vous vous habituez à les génériques, ce n'est pas de l'optimisation, c'est le code par défaut de conception 🙂
Je les utilise assez peu en fait, n'a tout simplement pas se produire pour moi au moment où j'ai écrit cela.
hey dude, c'est ok...
OriginalL'auteur devuxer
En gardant un ObjectContext ouvert pour la durée de vie de l'application est généralement une mauvaise idée.
ObjectContext (ou DbContext dans ce cas-ci) pour une Unité de Travail.
Voir Entity Framework et le Regroupement de Connexion
Je ne sais pas si c'est encore vrai il suffit de regarder EF Core thay maintenant de la piscine de la DbContext pour améliorer les performances!
OriginalL'auteur Ian Mercer