Verwalten von Verbindungen und Transaktionen (Entity Framework)

Standardmäßig wird die Verbindung zur Datenbank von Entity Framework verwaltet. Sie können jedoch sowohl Verbindungen als auch Transaktionen in der Entity Framework -Anwendung manuell verwalten.

Verbindungen und das Entity Framework

Entity Framework öffnet Verbindungen nur bei Bedarf, um beispielsweise eine Abfrage auszuführen oder SaveChanges aufzurufen, und schließt die Verbindung, sobald der Vorgang abgeschlossen ist.

Durch Aufrufen einer der folgenden Methoden wird die Verbindung hergestellt:

Bb896325.note(de-de,VS.100).gifHinweis:
Beim Aufrufen einer Abfragemethode wird die Verbindung hergestellt. Sie bleibt bestehen, bis ObjectResult vollständig verarbeitet oder verworfen wurde.

Manuell verwaltete Verbindungen

Entity Framework macht die EntityConnection über die Connection-Eigenschaft verfügbar. Damit können Verbindungen und Transaktionen verwaltet oder eine eigene EntityConnection bereitgestellt werden. Dies ist hilfreich, wenn eine Verbindung in einem Objektkontext kurzer Laufzeit beibehalten werden soll, um die Leistung zu erhöhen oder Transaktionen explizit zu steuern. Die gleiche von Entity Framework verwendete Anbieterverbindung kann auch von anderen Teilen einer Anwendung verwendet werden. Im folgenden Beispiel wird das explizite Herstellen einer Verbindung dargestellt.

' Explicitly open the connection. 
context.Connection.Open()
// Explicitly open the connection.    
context.Connection.Open();

Weitere Informationen finden Sie unter Gewusst wie: Manuelles Öffnen der Verbindung aus dem Objektkontext (Entity Framework).

Wenn die Verbindung in einem Objektkontext mit langer Laufzeit manuell hergestellt wird, muss die Methode Dispose aufgerufen werden, um sicherzustellen, dass die Verbindung beendet wird, wenn der Kontext nicht mehr benötigt wird. Sie können auch die Methode Close für EntityConnection aufrufen, um die Verbindung explizit zu beenden. Weitere Informationen finden Sie unter Gewusst wie: Verwalten der Verbindung in einem Objektkontext mit langer Laufzeit (Entity Framework).

Sie können auch eine EntityConnection erstellen und diese Verbindung dem Objektkontext angeben. In diesem Fall kann die Verbindung entweder manuell oder bei Bedarf über den Objektkontext hergestellt werden. Wenn Sie die EntityConnection im Objektkontext bereitgestellt haben, müssen Sie sicherstellen, dass sowohl der Kontext als auch die EntityConnection verworfen werden, wenn diese nicht mehr benötigt werden. Im folgenden Beispiel wird eine Verbindung erstellt und an den Objektkontext übergeben:

' Create an EntityConnection. 
Dim conn As New EntityConnection("name=AdventureWorksEntities")

' Create a long-running context with the connection. 
Dim context As New AdventureWorksEntities(conn)
// Create an EntityConnection.
EntityConnection conn =
    new EntityConnection("name=AdventureWorksEntities");

// Create a long-running context with the connection.
AdventureWorksEntities context =
    new AdventureWorksEntities(conn);

Weitere Informationen finden Sie unter Gewusst wie: Verwenden von EntityConnection mit einem Objektkontext (Entity Framework).

Überlegungen zum Verwalten von Verbindungen

Folgendes sollte beim Verwalten von Verbindungen beachtet werden:

  • Die Verbindung wird im Objektkontext hergestellt, sofern dies nicht bereits vor einem Vorgang erfolgt ist. Wenn die Verbindung im Objektkontext während eines Vorgangs hergestellt wird, wird diese nach Abschluss des Vorgangs beendet.

  • Wenn die Verbindung manuell hergestellt wird, wird sie im Objektkontext nicht beendet. Durch einen Aufruf von Close oder Dispose wird die Verbindung beendet.

  • Wenn die Verbindung im Objektkontext hergestellt wird, wird diese beim Verwerfen des Vorgangs ebenfalls verworfen.

  • In einem Objektkontext mit langer Laufzeit muss sichergestellt werden, dass der Kontext verworfen wird, wenn dieser nicht mehr erforderlich ist.

Wenn Sie eine offene EntityConnection für den Objektkontext bereitstellen, müssen Sie sicherstellen, dass diese freigegeben wird.

Transaktionen und das Entity Framework

Entity Framework unterstützt automatische Transaktionseintragung. Das heißt, dass im Objektkontext durchgeführte Aktivitäten, z. B. das Ausführen von Abfragen und das Speichern von Datenänderungen in der Datenquelle, in der Datenquelle isoliert werden können, indem der Vorgang im Rahmen einer System.Transactions-Transaktion durchgeführt wird. Transaktionen werden in Entity Framework bei folgenden Aktionen verwendet:

  • Das Ausführen mehrerer, von einer hohen Konsistenz abhängiger Vorgänge in der Datenquelle, beispielsweise Abfragen, die einen erfolgreichen Abschluss von Objektänderungen erfordern.

  • Das Koordinieren von Änderungen im Objektkontext mit anderen verteilten Vorgängen, wie dem Senden einer E-Mail-Benachrichtigung oder dem Schreiben in eine Nachrichtenwarteschlange.

Transaktionen, die eine Eintragung zusätzlicher Ressourcen-Manager erfordern, werden als verteilte Transaktionen bezeichnet. Für verteilte Transaktionen wird ein verteilter Transaktionskoordinator (Distributed Transaction Coordinator, DTC) verwendet, um die für das Abschließen der Transaktion erforderlichen Ressourcen zu verwalten. Die Heraufstufung einer Transaktion zu einem DTC kann ein aufwändig einzurichtendes und abzuschließendes Verfahren sein. Einige Ressourcen-Manager (z. B. SQL Server 2005) unterstützen das Transaktionsprotokoll PSPE (Promotable Single Phase Enlistment). Daher kann ein Ressourcen-Manager über eine Transaktion verfügen, die später gegebenenfalls zur Verwaltung durch einen DTC heraufgestuft werden kann.

Weitere Informationen über System.Transactions finden Sie unter Transaction Processing. Weitere Informationen zum Verwenden von System.Transactions mit SQL Server finden Sie unter System.Transactions Integration with SQL Server (ADO.NET).

Überlegungen zum Verwalten von Transaktionen

Folgendes sollte bei der Verwendung von Transaktionen mit Entity Framework beachtet werden:

  • Nur Vorgänge mit der Datenquelle sind transaktiv. An Objekten im Objektkontext vorgenommene Änderungen sind nicht transaktiv. Änderungen an Objekten im Kontext sind außerhalb des Transaktionsbereichs sichtbar.

  • Wenn eine aktuelle Transaktion vorhanden ist, und SaveChanges aufgerufen wird, wird diese Transaktion von Entity Framework für Vorgänge in der Datenquelle verwendet. Andernfalls wird für den Vorgang eine neue Transaktion erstellt. Transaktionen können mit EntityTransaction, Transaction oder TransactionScope definiert werden.

    Bb896325.note(de-de,VS.100).gifHinweis:
    Zum Vornehmen von Eintragungen in einer vorhandenen Transaktion wird die Verbindung von Entity Framework möglicherweise beendet und erneut hergestellt.

  • Wenn Entity Framework eine neue Transaktion für einen SaveChanges-Vorgang erstellt, werden Änderungen an Objekten im Objektkontext erst zugelassen, wenn die Transaktion abgeschlossen ist. Dies stellt sicher, dass der Zustand des Objektkontexts und der der Datenquelle konsistent sind.

  • Eine Transaktion wird möglicherweise zu einem DTC heraufgestuft, wenn eine Verbindung geschlossen und innerhalb einer einzelnen Transaktion erneut geöffnet wird. Da Entity Framework die Verbindung automatisch öffnet und schließt, sollten Sie erwägen, die Verbindung manuell zu öffnen und zu schließen, um die Höherstufung der Transaktion zu vermeiden. Weitere Informationen finden Sie unter Gewusst wie: Manuelles Öffnen der Verbindung aus dem Objektkontext (Entity Framework).

  • Wenn Vorgänge in einer Transaktion erneut durchgeführt werden sollen, muss sichergestellt werden, dass der Zustand der Objekte im Kontext nicht vor Abschluss der Transaktion zurückgesetzt wird. Hierzu muss SaveChanges mit dem Wert false für den Parameter acceptChangesDuringSave und nach erfolgreichem Abschluss anderer Vorgänge in der Transaktion AcceptAllChanges aufgerufen werden. Weitere Informationen finden Sie unter Gewusst wie: Verwalten von Transaktionen im Entity Framework.

Im Rahmen eines Wiederholungsvorgangs mit koordinierten Transaktionen können Sie SaveChanges ein zweites Mal aufrufen, ohne zuvor AcceptAllChanges aufzurufen. In diesem Fall versucht Entity Framework , die gleichen Änderungen erneut in der Datenquelle anzuwenden.

In diesem Abschnitt

Gewusst wie: Manuelles Öffnen der Verbindung aus dem Objektkontext (Entity Framework)

Gewusst wie: Verwalten der Verbindung in einem Objektkontext mit langer Laufzeit (Entity Framework)

Gewusst wie: Verwenden von EntityConnection mit einem Objektkontext (Entity Framework)

Gewusst wie: Verwalten von Transaktionen im Entity Framework