C # Linq-to-Sql - DataContext doit-il être supprimé à l'aide d'IDisposable
-
03-07-2019 - |
Question
J'ai plusieurs méthodes qui traitent de la base de données et toutes commencent par un appel
FaierDbDataContext db = new FaierDbDataContext();
Etant donné que l'objet DataContext Linq2Sql implémente IDisposable, doit-il être utilisé avec "en utilisant"? "
using (FaierDbDataContext db = new FaierDbDataContext()) {
// use db here
}
Quelles sont les implications de l’utiliser d’une manière ou d’une autre?
La solution
Contrairement à la plupart des types qui implémentent IDisposable, DataContext 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 pour lesquelles nous avons implémenté IDisposable:
- Si la logique de l'application doit conserver une entité au-delà de DataContext devrait être utilisé ou valide, vous pouvez appliquer ce contrat en appeler Dispose. Chargeurs différés en cette entité fera toujours référence le DataContext et va essayer de l'utiliser si un code tente de naviguer dans la propriétés différées. Ces tentatives va échouer. Dispose force également le DataContext pour vider son cache de entités matérialisées de telle sorte qu'un seul entité mise en cache ne sera pas accidentellement garder 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 la connexion DataContext peut être trompé en laissant la connexion ouvrir. Le DataContext s'appuie sur le code d'application énumérant tous les résultats d'une requête depuis l'obtention de la fin d'un jeu de résultats déclenche la connexion à fermer. Si la 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ée. Si ton l'application rencontre des problèmes avec les connexions ne se ferment pas et vous soupçonner le comportement de fermeture automatique ne fonctionne pas, vous pouvez utiliser le Dispose motif comme un moyen de contourner.
à partir de la source
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow