管理連接和交易 (Entity Framework)

根據預設,Entity Framework 會管理與資料庫的連接。 不過,您可以手動管理 Entity Framework 應用程式中的連接和交易。

連接與 Entity Framework

Entity Framework 只會在必要時開啟連接,例如,為了執行查詢或呼叫 SaveChanges,然後在完成作業時關閉連接。

呼叫以下任何一個方法會開啟連接:

Bb896325.note(zh-tw,VS.100).gif注意:
當呼叫查詢方法時,此連接便會開啟,而且在完全使用或處置 ObjectResult 之前,此連接都會維持開啟狀態。

手動管理連接

Entity Framework 會透過 Connection 屬性公開 EntityConnection。 如此可讓您管理連接和交易,或是提供自己的 EntityConnection。 當您想要將連接保留在短期的物件內容中,以改善效能或是明確控制交易時,這樣的作法會很實用。 Entity Framework 所使用的相同提供者連接可以與應用程式的其他部分共用。 下列範例示範如何明確開啟連接:

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

如需詳細資訊,請參閱 HOW TO:從物件內容手動開啟連接 (Entity Framework)

當您在長時間執行的物件內容中手動開啟連接時,您必須呼叫 Dispose 方法,以確定當不再需要物件內容時會關閉連接。 您也可以在 EntityConnection 上呼叫 Close 方法來明確關閉連接。 如需詳細資訊,請參閱 HOW TO:在長時間執行的物件內容中管理連接 (Entity Framework)

您也可以建立 EntityConnection,並將這個連接提供給物件內容。 在此情況下,您可以手動開啟連接,或是在需要時允許物件內容開啟連接。 當您為物件內容提供 EntityConnection 時,您必須確定當物件內容和 EntityConnection 不再需要時會加以處置。 下列範例會建立連接,並將它傳遞給物件內容:

' 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);

如需詳細資訊,請參閱 HOW TO:使用 EntityConnection 搭配物件內容 (Entity Framework)

管理連接的考量

下列考量適用於管理連接時:

  • 如果在作業開始之前尚未開啟連接,物件內容將會開啟連接。 如果物件內容在作業期間開啟連接,它一定會在作業完成時關閉連接。

  • 如果您手動開啟連接,物件內容不會將連接關閉。 呼叫 CloseDispose 將會關閉連接。

  • 如果物件內容建立連接,則當處置物件內容時,一定會處置此連接。

  • 在長時間執行的物件內容中,您必須確定當物件內容不再需要時,要將它處置。

如果您為物件內容提供開啟的 EntityConnection,您必須確定它已處置。

交易與 Entity Framework

Entity Framework 可支援自動交易的登記。 這表示在物件內容中執行的活動 (例如執行查詢,並將資料的變更儲存在資料來源中) 可以在資料來源中隔離,其方式是在 System.Transactions 交易內執行此作業。 在 Entity Framework 中使用交易可執行以下動作:

  • 若要針對必須高度一致的資料來源執行多項作業,例如依賴物件變更成功完成的查詢。

  • 若要讓物件內容中的變更與其他分散式作業協調,例如傳送電子郵件通知或寫入訊息佇列。

需要登記其他資源管理員的交易稱為「分散式交易」(Distributed Transaction)。 分散式交易會使用分散式交易協調器 (DTC) 來管理完成交易所需的資源。 將交易提升至 DTC 時,可能需要耗費相當大的成本才能建立及完成。 某些資源管理員 (如 SQL Server 2005) 可支援單一階段登記 (Promotable Single Phase Enlistment,PSPE) 交易通訊協定。 如此可讓資源管理員裝載一個可於稍後提升的交易,以便在必要時由分散式交易協調器 (DTC) 管理它。

如需 System.Transactions 的詳細資訊,請參閱 Transaction Processing。 如需使用 System.Transactions 搭配 SQL Server 的詳細資訊,請參閱 System.Transactions Integration with SQL Server (ADO.NET)

管理交易的考量

下列考量適用於當您搭配 Entity Framework 使用交易時:

  • 只交易針對資料來源的作業。 對物件內容中之物件所做的變更則不會交易。 對物件內容中之物件所做的變更可在交易範圍的外面看到。

  • 當您呼叫 SaveChanges 時,如果目前的交易存在,Entity Framework 就會將這個交易用於針對資料來源進行的作業。 否則,它會針對此作業建立新的交易。 您可以使用 EntityTransactionTransactionTransactionScope 定義交易。

    Bb896325.note(zh-tw,VS.100).gif注意:
    若要登記現有的交易,Entity Framework 可能會關閉並重新開啟連接。

  • 當 Entity Framework 針對 SaveChanges 作業建立新的交易時,要等到交易完成之後,才可接受物件內容中物件的變更。 如此可確保物件內容的狀態及資料來源是一致的。

  • 當單一交易內的連接關閉又重新開啟時,可能會將交易提升至 DTC。 因為 Entity Framework 會自動開啟及關閉連接,所以您應該考慮手動開啟及關閉連接以避免交易提升。 如需詳細資訊,請參閱 HOW TO:從物件內容手動開啟連接 (Entity Framework)

  • 當您打算重試交易中的作業時,您必須確定交易完成之前並未重設物件內容中的物件狀態。 若要這樣做,您必須呼叫 SaveChanges (包含 acceptChangesDuringSave 參數的 false 值),然後只有在交易中的其他作業成功完成之後,才能呼叫 AcceptAllChanges。 如需詳細資訊,請參閱 HOW TO:管理 Entity Framework 中的交易

在協調交易的重試作業當中,您可能第二次呼叫 SaveChanges 但是未先呼叫 AcceptAllChanges。 在此情況下,Entity Framework 會嘗試將相同的變更重新套用到資料來源。

本節內容

HOW TO:從物件內容手動開啟連接 (Entity Framework)

HOW TO:在長時間執行的物件內容中管理連接 (Entity Framework)

HOW TO:使用 EntityConnection 搭配物件內容 (Entity Framework)

HOW TO:管理 Entity Framework 中的交易