使用物件
Entity Framework 可讓您查詢、插入、更新及刪除資料 (這些資料表示為實體型別執行個體的具型別 Common Language Runtime (CLR) 物件)。 這些實體類型代表在概念模型中定義的實體。Entity Framework 會將概念模型中定義的實體和關聯性對應至資料來源。Entity Framework 提供了可進行下列作業的機能:將資料來源傳回的資料具體化為物件、追蹤對物件所做的變更、處理並行、將物件變更傳播回資料來源,以及將物件繫結至控制項。您可以使用 LINQ to Entities、Entity 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 中,您可以使用衍生自 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)
使用 ObjectSet (Entity Framework)