L'objet de contexte Disposing of Entity Framework est-il requis?
Nous sommes à l'aide de entity framework pour la communication avec la base de données dans notre service WCF méthodes, nous avons récemment exécuter le code de l'outil d'examen sur notre code de service. Comme d'habitude nous avons beaucoup d'examen des propositions par l'outil et de nombreux commentaires ont été suggérant à jeter le Cadre de l'Entité objet de contexte. Donc, ma question est si j'utilise Entity Framework objet de contexte à l'intérieur d'une méthode et une fois que je sors de la méthode, la GC ne nettoie pas l'objet de contexte ? devons-nous disposer explicitement objet de contexte ?
source d'informationauteur Abhinay
Vous devez vous connecter pour publier un commentaire.
Simplement:
DbContext
implémenteIDisposable
par conséquent, vous devriez jeter, manuellement, dès que vous avez terminé avec elle.Vous n'avez pas besoin de les jeter, parce que le GC recueillir par la suite, mais le GC n'est pas déterministe: vous ne savez jamais quand "finalement". Jusqu'à ce qu'il est éliminé, il tiendra des ressources qui ne sont pas en cours d'utilisation - par exemple, il peut encore avoir une base de données ouverte de connexion. Ces ressources ne sont pas libérés jusqu'à ce que le GC s'exécute, sauf vous débarrasser manuellement. En fonction des détails que vous pouvez trouver que vous avez bloquée inutilement les ressources du réseau, les accès aux fichiers, et vous serez certainement garder plus de mémoire réservée que vous en avez besoin.
Il y a plus de potentiel de succès, trop: lorsque vous défaire d'un objet à la main, la GC n'a généralement pas besoin d'appeler le Finaliseur sur cet objet (si il y en a un). Si vous laissez le GC automatiquement se défaire d'un objet avec un outil de finalisation, il suffira de placer l'objet dans un Finaliseur de File d'attente, et sera automatiquement promouvoir l'objet de la prochaine GC génération. Cela signifie qu'un objet avec un outil de finalisation sera toujours traîner sur les ordres de grandeur plus que nécessaire avant d'être GCed (comme une succession de GC générations sont collectées moins fréquemment).
DBContext
entrerait dans cette catégorie de sous-jacent à la base de données de connexion seront de code non managé.(Utile référence.)
Je pense que la meilleure approche est de codage à l'intérieur d'une instruction d'utilisation
donc c'est automaitaclly éliminés
En général, si quelque chose implémente
IDisposable
c'est une Bonne Idée(TM) explicitement en disposer lorsque vous êtes à travers. Cela est particulièrement vrai si vous ne possédez pas de la mise en œuvre de l'objet; vous devez la traiter comme une boîte noire dans ce cas. En outre, même si ce n'était pas nécessairement "nécessaire" pour l'éliminer maintenant, il est peut-être dans l'avenir.Donc, à mon humble avis, la question de savoir si vous "devez" explicitement disposer de l'objet n'est pas pertinent. Si elle demande à être éliminés par la vertu de la mise en œuvre de
IDisposable
- il, doivent être éliminés.Recommandé chose à faire avec un DBContext est de ne pas en disposer à tout (c'est l'exception à la règle dans la plupart des cas), même s'il est un objet jetable.
Un exemple de la question, ths premier exemple est de prendre un appel et de l'évaluation dans l'instruction d'utilisation, tandis que le second évalue après. (première ons s'exécute, le second, déclenche une erreur
The operation cannot be completed because the DbContext has been disposed.
)Le même problème se produit dans
Aslong que vous n'avez pas l'ouvrir manuellement la connexion, vous êtes en sécurité en utilisant simplement
et de ne jamais le mettre au rebut. comme il prendra soin de lui-même dans la plupart des cas, c'est ce qu'il est conçu pour faire.
Maintenant si vous ouvrez une connexion par la force, alors le contexte l'habitude de fermer automatiquement lorsque le transfert est terminé, comme il ne sait pas quand et puis vous devez/doit disposer de l'objet ou de fermer la connexion et l'objet non divulgués.
Supplémentaire minuit lecture: