8

Wir haben eine statische Klassenbibliothek, die sich mit wiederholten multikontextuellen Aufgaben beschäftigt. Ist es eine schlechte Übung, einen EF-DB-Kontext als Mitglied einer statischen Klasse zu erstellen?Pros und Contras zum Setzen eines Db-Kontexts in statische Klassenbibliothek

DB-Kontexte sollen aus einem bestimmten Grund entsorgt werden. Wenn sie häufig entsorgt werden, "fließt" der Verbindungspool und wahrscheinlich (hier spekuliere ich), dass Tabellen nicht gesperrt bleiben.

Also lade ich Probleme mit einem Db-Kontext in einer statischen Klasse oder überlege ich dies?

Antwort

14

IMO das ist definitiv nicht etwas, was Sie tun möchten.

Sperren ist nicht das eigentliche Problem, das Sie hier haben werden. EF wird nur für die Dauer eines Aufrufs zum Speichern von Änderungen gesperrt (dies ist einer der großen Vorteile der Verwendung eines Verfolgungsdiagramms für teilweise festgeschriebene Transaktionen, die von den meisten anderen ORMs verwendet werden).

Was Sie verursachen wird, ist das Tracking-Diagramm selbst. Wie EF funktioniert (in den meisten Fällen) ist es, dass es eine Kopie von jeder Entität behält, die es jemals gesehen hat, und durchläuft sie, um herauszufinden, was geändert wurde, und führt einen Prozess namens fixups aus, der Navigationseigenschaften mit Backlinks arbeiten lässt. Dieser Prozess durchläuft jede Entität, die der Kontext jemals gesehen hat, und wird bei einer Reihe von Operationen aufgerufen (Hinzufügen, Anfügen, Löschen, Speichern, Abfragen und einige andere). Dies bedeutet, wenn der Tracking-Graph groß ist, kann dieser Prozess ziemlich viel Zeit in Anspruch nehmen. Wenn Sie Ihren Kontext für immer am Leben erhalten, tendiert die Größe des Tracking-Diagramms zur Größe Ihrer Datenbank, was es unhandlich und langsam macht.

+0

Danke für die Bestätigung. Ich stimme zu. –

+2

@davea Ich benutze Dependency Injection, um den Kontextlebenszyklus zu verwalten, mit entweder einer neuen Instanz pro Anfrage (in einem webbasierten Szenario) oder einer neuen Instanz jedes Mal. –

+0

Luke, ich habe über DI als Muster gelesen und verstehe etwas von seinem Wert. Würde mir ein Framework wie Ninject helfen? –

6

Es hängt von vielen Dingen, aber hier sind einige Gedanken zB:

  • Wenn Sie EF verwenden auf Service-Layer - dann könnte die Gleichzeitigkeit ein Problem sein, da ich glaube nicht, dass EF Zusammenhang mit ist threadsicher, dh Sie können es ohne Probleme von allen Threads gleichzeitig verwenden
  • Wenn Sie Ihre Entitäten durch den Kontext verfolgt haben (und ich denke, selbst wenn Sie nicht), würde der Kontext mit der Zeit ziemlich werden groß, möglicherweise könnte es alle Ihre Datenbank-Entitäten enthalten und dann werden Sie in Leistungsprobleme

Wie auch immer, ich denke, es ist eine schlechte Idee.

+0

Danke für die Bestätigung. Ich stimme zu. –