2009-05-04 6 views
27

ich mehrere Methoden, die mit DB beschäftigen und alle von ihnen beginnen mitC# Linq-to-Sql - entsorgt werden sollte IDisposable mit Datacontext

FaierDbDataContext db = new FaierDbDataContext(); 

Aufruf Da die Linq2Sql Datacontext-Objekt implementiert IDisposable, sollte diese verwendet werden, mit "benutzen"?

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

Welche Auswirkungen hat die Verwendung auf die eine oder andere Weise?

+8

Auch eine Randnotiz, für Menschen, LINQ verwenden Sie keine Instanz Variable Ihres Datacontext für Ihre Datenmodellklasse halten sollte. Erklären Sie stattdessen jedes Mal, wenn Sie Ihre Methoden anwenden müssen. – mmcdole

Antwort

29

Anders als die meisten Typen, die IDisposable implementieren, Datacontext nicht wirklich brauchen Entsorgung - zumindest nicht in den meisten Fällen. Ich fragte Matt Warren über diese Design-Entscheidung, und hier war seine Antwort:

Es gibt ein paar Gründe, warum wir IDisposable implementiert:

  • Wenn die Anwendungslogik muss auf eine Entität über, wenn die halten DataContext wird voraussichtlich verwendet oder gültig Sie können diesen Vertrag durch Aufruf von Dispose erzwingen. Zurückgestellte Lader in diese Entität wird immer noch den DataContext referenzieren und versuchen, es verwenden, wenn Code versucht, die verzögerten Eigenschaften zu navigieren. Diese Versuche werden fehlschlagen. Entsorgen Sie zwingt auch die Datacontext seinen Cache-Dump von Einheiten materialisiert, so dass eine einzelne gecached Einheit nicht versehentlich am Leben erhalten alle Einheiten durch diese Datacontext materialisiert, das würde sonst verursachen, was ein Speicherleck zu sein scheint.
  • Die Logik, die die DataContext-Verbindung automatisch schließt, kann sein, damit die Verbindung offen bleibt. Der DataContext basiert auf dem Anwendungscode, der alle Ergebnisse einer Abfrage auflistet, da das Ende einer Ergebnismenge erreicht, löst die Verbindung aus, um zu schließen. Wenn die Anwendung IEnumerables MoveNext-Methode anstelle einer foreach -Anweisung in C# oder VB verwendet, können Sie die Enumeration vorzeitig beenden. Wenn Ihre Anwendung Probleme mit Verbindungen nicht schließen und Sie vermuten, dass das automatische Schließverhalten nicht funktioniert, können Sie das Dispose Muster als eine Arbeit verwenden.

vom source