- Das Verbindungspooling wird wie in jeder anderen ADO.NET-Anwendung behandelt. Die Entitätsverbindung verwendet weiterhin die herkömmliche Datenbankverbindung mit der herkömmlichen Verbindungszeichenfolge. Ich glaube, Sie können das Verbindungspooling in der Verbindungszeichenfolge deaktivieren, wenn Sie es nicht verwenden möchten. (Lesen Sie mehr über SQL Server Connection Pooling (ADO.NET). )
- Verwenden Sie niemals den globalen Kontext. ObjectContext implementiert intern mehrere Muster, einschließlich Identity Map und Unit of Work. Die Verwendung des globalen Kontexts ist je nach Anwendungstyp unterschiedlich.
- Verwenden Sie für Webanwendungen einen einzelnen Kontext pro Anforderung. Verwenden Sie für Webdienste einen einzelnen Kontext pro Anruf. Verwenden Sie in WinForms oder WPF-Anwendungen einen einzelnen Kontext pro Formular oder pro Präsentator. Es kann einige spezielle Anforderungen geben, die die Verwendung dieses Ansatzes nicht zulassen, aber in den meisten Situationen ist dies ausreichend.
Wenn Sie wissen möchten, welche Auswirkungen der Einzelobjektkontext für die WPF / WinForm-Anwendung hat, lesen Sie diesen Artikel . Es geht um NHibernate Session, aber die Idee ist dieselbe.
Bearbeiten:
Wenn Sie EF verwenden, wird jede Entität standardmäßig nur einmal pro Kontext geladen. Die erste Abfrage erstellt eine Entitätsinstanz und speichert sie intern. Jede nachfolgende Abfrage, für die eine Entität mit demselben Schlüssel erforderlich ist, gibt diese gespeicherte Instanz zurück. Wenn sich die Werte im Datenspeicher geändert haben, erhalten Sie die Entität weiterhin mit Werten aus der ersten Abfrage. Dies wird als Identitätskartenmuster bezeichnet . Sie können den Objektkontext zwingen, die Entität neu zu laden, aber es wird eine einzelne gemeinsam genutzte Instanz neu geladen.
An der Entität vorgenommene Änderungen werden erst beibehalten, wenn Sie SaveChanges
den Kontext aufrufen . Sie können Änderungen an mehreren Entitäten vornehmen und diese gleichzeitig speichern. Dies wird als Arbeitseinheitsmuster bezeichnet . Sie können nicht selektiv angeben, welche geänderte angehängte Entität Sie speichern möchten.
Kombinieren Sie diese beiden Muster und Sie werden einige interessante Effekte sehen. Sie haben nur eine Instanz einer Entität für die gesamte Anwendung. Alle Änderungen an der Entität wirken sich auf die gesamte Anwendung aus, auch wenn die Änderungen noch nicht beibehalten (festgeschrieben) wurden. In den meisten Fällen ist dies nicht das, was Sie wollen. Angenommen, Sie haben ein Bearbeitungsformular in der WPF-Anwendung. Sie arbeiten mit der Entität und entscheiden sich, die komplexe Bearbeitung abzubrechen (Ändern von Werten, Hinzufügen verwandter Entitäten, Entfernen anderer verwandter Entitäten usw.). Die Entität wurde jedoch bereits im gemeinsam genutzten Kontext geändert. Was wirst du machen? Hinweis: Ich kenne keine CancelChanges oder UndoChanges ObjectContext
.
Ich denke, wir müssen das Serverszenario nicht diskutieren. Durch die einfache Freigabe einer einzelnen Entität für mehrere HTTP-Anforderungen oder Webdienstaufrufe wird Ihre Anwendung unbrauchbar. Jede Anforderung kann nur SaveChanges
Teildaten aus einer anderen Anforderung auslösen und speichern, da Sie eine einzelne Arbeitseinheit unter allen teilen. Dies hat auch ein anderes Problem: Der Kontext und jede Manipulation mit Entitäten im Kontext oder einer vom Kontext verwendeten Datenbankverbindung ist nicht threadsicher.
Selbst für eine schreibgeschützte Anwendung ist ein globaler Kontext keine gute Wahl, da Sie wahrscheinlich jedes Mal, wenn Sie die Anwendung abfragen, neue Daten benötigen.