C # Linq-To-Sql-DataContext doit-il être éliminé en utilisant IDisposable

J'ai plusieurs méthodes qui traitent de DB et toutes commencent par appeler

FaierDbDataContext db = new FaierDbDataContext();

Puisque L'objet Linq2Sql DataContext implémente IDisposable, devrait-il être utilisé avec "using"?

using (FaierDbDataContext db = new FaierDbDataContext()) {
    // use db here
}

Quelles sont les implications de l'utilisation d'une manière ou d'une autre?

27
demandé sur Mark Byers 2009-05-04 23:27:26

1 réponses

Contrairement à la plupart des types qui implémentent IDisposable, DataContext ne le fait pas vraiment besoin de disposer - du moins pas dans la plupart des cas. J'ai demandé à Matt Warren à propos de cette décision de conception, et ici était sa réponse:

Il y a quelques raisons que nous avons implémentées IDisposable:

  • Si la logique d'application doit tenir sur une entité au-delà de DataContext devrait être utilisé ou valide Vous pouvez appliquer ce contrat en l'appel de la Jeter. Chargeurs différés dans cette entité fera toujours référence le DataContext et va essayer de l'utiliser si un code tente de naviguer dans le propriétés différées. Ces tentatives va échouer. Disposer force également le DataContext pour vider son cache de entités matérialisées de sorte qu'un seul l'entité mise en cache ne sera pas accidentellement maintenir en vie toutes les entités matérialisées à travers ce DataContext, qui serait sinon causer ce qui semble être un fuite de mémoire.
  • La logique qui ferme automatiquement le La connexion DataContext peut être dupé en quittant la connexion ouvrir. Le DataContext repose sur code d'application énumérant tout les résultats d'une requête depuis l'obtention de la fin d'un resultset déclenche le connexion à fermer. Si l' l'application utilise IEnumerable Méthode MoveNext au lieu d'un foreach déclaration en C # ou VB, vous pouvez quitter l'énumération prématurément. Si votre l'application éprouve des problèmes avec les connexions ne se ferment pas et vous suspectez l'automatique comportement de fermeture ne fonctionne pas vous pouvez utiliser le disposer modèle comme un travail autour.

À partir de la source {[14]

29
répondu Sadegh 2010-02-17 21:51:47