使用物件

Entity Framework 可讓您查詢、插入、更新及刪除資料 (這些資料表示為實體型別執行個體的具型別 Common Language Runtime (CLR) 物件)。 這些實體類型代表在概念模型中定義的實體。Entity Framework 會將概念模型中定義的實體和關聯性對應至資料來源。Entity Framework 提供了可進行下列作業的機能:將資料來源傳回的資料具體化為物件、追蹤對物件所做的變更、處理並行、將物件變更傳播回資料來源,以及將物件繫結至控制項。您可以使用 LINQ to EntitiesEntity SQL 語言查詢產生器方法 (Entity Framework),針對概念模型執行查詢。如需詳細資訊,請參閱查詢概念模型 (Entity Framework)

Entity Framework 會提供可根據概念模型自動產生物件層的工具。此物件層包括實體類型和物件內容定義。物件內容定義會包含通常具有一組屬性的 ObjectContext 衍生類別,而這些屬性會傳回指定之類型的實體集合。若要產生物件層程式碼,請使用Entity Data Model Designer (Entity Designer) 或 EdmGen.exe 命令列工具。如需詳細資訊,請參閱Generated Code Overview

本主題討論物件內容類別以及 Entity Framework 支援的實體型別。

物件內容

ObjectContext 類別是與實體物件互動的主要類別。ObjectContext 類別的執行個體會封裝下列項目:資料庫的連接、描述模型的中繼資料,以及在建立、更新和刪除作業期間追蹤物件的 ObjectStateManager 物件。

存留期

ObjectContext 的存留期開始於建立執行個體時,並結束於執行個體遭到處置或記憶體回收時。如果您希望內容所控制的所有資源都在區塊結尾處置,請使用 using。當您使用 using 時,編譯器會建立 try/finally 區塊,並呼叫 finally 區塊中的 dispose。以下是決定物件內容存留期的幾個一般性原則:

  • 當使用長時間執行的物件內容時,請考量以下事項:

    • 當您將其他物件以及物件的參考載入記憶體時,物件內容的記憶體耗用量可能會快速增加。這可能會導致效能問題。

    • 當不再需要內容時,請記得處置內容。

    • 如果例外狀況造成物件內容處於無法復原的狀態,整個應用程式可能會終止。

    • 當查詢資料與更新資料之間的時間差距增加時,遇到並行相關問題的機率也會增加。

  • 當使用 Web 應用程式時,每個要求都要使用一個物件內容執行個體。如果您想要追蹤您的物件在不同層之間的變更,請使用自我追蹤實體。如需詳細資訊,請參閱使用自我追蹤實體建置 N-Tier 應用程式

  • 當您使用 Windows Presentation Foundation (WPF) 或 Windows Form 時,每個表單都要使用一個物件內容執行個體。如此可讓您使用物件內容所提供的變更追蹤功能。

連接

根據預設,物件內容會管理與資料庫的連接。物件內容會視需要開啟及關閉連接。例如,物件內容會開啟連接來執行查詢,然後在處理所有結果集之後關閉連接。

在某些情況下,您會想要擁有更大的控制權來控制何時開啟及關閉連接。例如,當您使用 SQL Server Compact 時,開啟及關閉相同的連接需要很高的成本。您可以使用 Connection 屬性來手動管理這個處理序。如需詳細資訊,請參閱管理連接和交易 (Entity Framework)

多執行緒

ObjectContext 並不具備執行緒安全。只要這個類別的執行個體並未在執行緒之間共用,您仍然可以建立多執行緒應用程式。如果您打算將實體物件從一個執行緒傳送到另一個執行緒,請務必在每一個實體上呼叫 Detach,然後再將它傳送給另一個執行緒。如需詳細資訊,請參閱附加及中斷連結物件

其他資源

下列主題提供了有關如何管理物件內容的詳細資訊,其中包括管理連接和交易、附加物件、處理關聯性,以及管理變更追蹤和識別解析:

識別解析、狀態管理和變更追蹤.

建立、加入、修改和刪除物件

附加及中斷連結物件

定義及管理關聯性

管理連接和交易 (Entity Framework)

儲存變更及管理並行存取 (Entity Framework)

實體型別

在 Entity Framework 中,您可以使用衍生自 EntityObject 的實體型別、「單純」的 CLR 物件 (POCO) 型別、POCO Proxy 型別和自我追蹤實體型別。下列各節將提供一些資訊,這些資訊可協助您根據應用程式的本質,決定適合使用哪一個選項。

EntityObject

根據預設,ADO.NET 實體資料模型 工具會產生 EntityObject 衍生實體類型。當您使用 EntityObject 衍生類型時,物件內容就會管理物件之間的關聯性、在發生變更時追蹤變更,以及以最有效率的方式支援消極式載入。不過,EntityObject 衍生類型對 Entity Framework 具有高度相依性。如果您要使用需要非持續性的架構 (例如,測試導向開發或網域導向開發),或者您已經擁有網域類別,請考慮使用 POCO 或 POCO Proxy。

POCO

Entity Framework 可讓您使用現有的網域物件搭配資料模型,而不需要修改資料類別本身。這些 POCO 資料類別 (也稱為非持續性物件) 與實體資料模型 工具所產生的實體類型支援大多數相同的查詢、插入、更新和刪除行為。 

當您使用 POCO 型別時,若對物件圖形進行變更,Entity Framework 不會自動追蹤變更。Entity Framework 會使用快照機制來偵測物件的變更。若要同步處理物件內容與您的圖形,請呼叫 DetectChanges。根據預設,物件內容會先呼叫這個方法,然後再將資料儲存至資料來源。這項機制會比立即通知機制使用更多記憶體,而且可能會影響效能,尤其是應用程式經常需要偵測變更的情況。 如需詳細資訊,請參閱追蹤 POCO 實體中的變更 (Entity Framework)。 若要擁有立即通知支援,請啟用變更追蹤 Proxy 物件的建立作業。

如果您想要利用消極式載入,就必須啟用消極式載入 Proxy 建立。如需詳細資訊,請參閱下面的<POCO Proxy>一節。

POCO Proxy

如果您想要使用非常有效率且立即的變更追蹤和消極式載入,請使用 POCO Proxy。當您使用 Proxy 時,就會擁有與 EntityObject 衍生類型相同的功能,不過仍然會將您的網域類別與 Entity Framework 分隔開。 若要啟用消極式載入 Proxy 及/或立即變更追蹤 Proxy 建立,您的 POCO 類別就必須符合 建立 POCO Proxy 的需求 (Entity Framework)主題中所描述的需求。 

Proxy 是在執行階段期間建立的,而且繼承自 POCO 型別。這表示實體的執行階段型別會與 POCO 型別不同。這又牽涉到一些與序列化相關的複雜問題。如需詳細資訊,請參閱使用 POCO 實體 (Entity Framework)。請注意,與 POCO 型別相較之下,建立 Proxy 型別具有一些額外負荷。

自我追蹤實體

在實體物件可附加至處理變更追蹤之物件內容的應用程式中,EntityObject 衍生類型、POCO 和 POCO Proxy 型別都可正常運作。不過,當您必須將實體的完整圖形傳輸至無法使用物件內容的某一層時,就必須決定如何追蹤變更以及將這些變更回報至物件內容。從 .NET Framework 4 版開始,自我追蹤實體就可以記錄純量、複雜和導覽屬性的變更。 自行追蹤式實體與 Entity Framework 無關。[ADO.NET 自我追蹤實體產生器] 範本會產生自我追蹤實體。 如需詳細資訊,請參閱使用自我追蹤實體

效能考量

下列效能考量也可協助您選擇最適合應用程式使用的物件型別。

  • 載入中繼資料時,探索 POCO 或 Proxy 型別的成本大於探索已設定屬性之 EntityObject 衍生類型的成本。

  • 產生動態 POCO Proxy 型別會產生一些額外負荷。

  • 與 Proxy 和 EntityObject 衍生類型相較之下,初始化 POCO 型別會產生最少的額外負荷。

  • POCO 快照追蹤的成本大於立即通知追蹤的成本。

本章節內容

複雜型別物件

定義及管理關聯性

建立、加入、修改和刪除物件

附加及中斷連結物件

識別解析、狀態管理和變更追蹤

管理連接和交易 (Entity Framework)

儲存變更及管理並行存取 (Entity Framework)

將物件與控制項繫結 (Entity Framework)

使用實體索引鍵 (Entity Framework)

序列化物件 (Entity Framework)

使用 ObjectSet (Entity Framework)

自訂物件 (Entity Framework)

另請參閱

概念

查詢概念模型 (Entity Framework)
快速入門 (Entity Framework)