使用 POCO 實體 (Entity Framework)

Entity Framework 可讓您使用自訂的資料類別加上自己的資料模型,而不須修改資料類別本身。 這表示您可以使用「單純」(plain-old) CLR 物件 (POCO),例如現有的網域物件,加上您的資料模型。 這些 POCO 資料類別 (也稱為非持續性物件) 對應至資料模型中所定義之實體,可支援與 實體資料模型 工具所產生之大多數實體類型相同的查詢、插入、更新和刪除行為。

對應需求

若要搭配 POCO 實體使用資料模型,實體類型的名稱必須與自訂資料類別相同,而且實體類型的每個屬性都必須對應至自訂資料類別的公用屬性。 類型的名稱和每對已對應的屬性都必須對等。 如需如何修改概念模型中之實體的詳細資訊,請參閱 How to: Create and Modify Entity Types

Dd456853.note(zh-tw,VS.100).gif注意:
如果將任何對應屬性套用至自訂資料類別,包括組件層級上的 EdmSchemaAttribute,則不支援對應 POCO 實體。

您可以使用 POCO 範本,根據概念模型產生非持續性實體類型。 此範本並未隨附於 Visual Studio,不過您可從 Visual Studio Gallery (英文) 下載。

Proxy 物件建立

如果您希望 Entity Framework 在變更發生時追蹤 POCO 類別中的變更,及支援相關物件的消極式載入,您的 POCO 類別必須符合建立 POCO Proxy 的需求 (Entity Framework)主題中所述的需求。

當 POCO 實體啟用 Proxy 物件建立時,在對圖形和物件屬性值進行變更時,Entity Framework 會自動追蹤變更。 如需使用或不使用 Proxy 之變更追蹤選項的詳細資訊,請參閱追蹤 POCO 實體中的變更 (Entity Framework)

您可以將 POCO 實體與 Proxy 實體物件混合。 若要停用建立 Proxy 物件,在 ObjectContext 上由 ContextOptions 屬性傳回之 ObjectContextOptions 的執行個體上,將 ProxyCreationEnabled 屬性設定為 false

' Disable proxy object creation. 
context.ContextOptions.ProxyCreationEnabled = False
// Disable proxy object creation.
context.ContextOptions.ProxyCreationEnabled = false;

如需詳細資訊,請參閱 HOW TO:建立使用 Proxy 的 POCO 實體 (Entity Framework)

序列化 POCO Proxy

Windows Communication Foundation (WCF) 無法直接序列化或還原序列化 Proxy,因為 DataContractSerializer 只能序列化與還原序列化已知型別,而 Proxy 型別不是已知型別。 當您必須序列化 POCO 實體時,請停用 Proxy 建立或使用 ProxyDataContractResolver 類別來將 Proxy 物件序列化為原始的 POCO 實體。 若要停用 Proxy 建立,請將 ProxyCreationEnabled 屬性設定為 false

ProxyDataContractResolver 類別會在序列化期間將 Proxy 型別對應至 POCO 型別。 若要指示 DataContractSerializer 在服務作業中使用 ProxyDataContractResolver 類別,請定義屬性類別 (將套用至服務作業的類別),該類別會在內部使用 ProxyDataContractResolver 將 Proxy 型別對應至純粹 POCO 型別。 將這個屬性類別與 WCF 應用程式中服務合約之一部分的方法產生關聯。

用戶端將接收及還原序列化實際的 POCO 實體。 這些類別將沒有 Proxy 物件的消極式載入及變更追蹤功能。 若要跨層在這些實體中追蹤變更,請使用自我追蹤實體。 自我追蹤實體就是 POCO 實體,它們對 Entity Framework 沒有相依性,而且包含自己的變更追蹤邏輯。 如需詳細資訊,請參閱逐步解說:序列化自我追蹤實體

如需詳細資訊,請參閱 逐步解說:使用 WCF 序列化 POCO Proxy (Entity Framework)

Proxy 物件可以使用二進位序列化進行序列化及還原序列化。 不過,在跨 AppDomain 界限序列化物件圖形時,您必須確保目標環境中已存在該 Proxy 型別定義。 如果型別不存在,還原序列化會失敗。 若要確保型別存在,請使用 CreateProxyTypes

Dd456853.note(zh-tw,VS.100).gif注意:
即使建立 Proxy 型別的物件,它也沒有 Proxy 的消極式載入及變更追蹤功能。

使用二進位序列化和資料合約序列化,相關的物件就會與主要物件一起序列化。 消極式載入會針對每個存取之關聯性導覽屬性執行查詢,而且二進位序列化程式和 WCF 資料合約序列化程式會存取所有關聯性導覽屬性。 這可能會造成很多未預期的查詢在序列化期間執行。 如果您沒有停用 Proxy 型別建立 (這麼做會停用消極式載入),請明確停用消極式載入,如下列範例所示。

' Disable lazy loading. 
context.ContextOptions.LazyLoadingEnabled = False
// Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = false;

如需詳細資訊,請參閱序列化物件 (Entity Framework)

Proxy 特定 API 的摘要

下面是與使用 POCO Proxy 有關的 API:

成員 說明

CreateObject

如果您的 POCO 類別符合建立 POCO Proxy 的需求 (Entity Framework)主題中所述的需求,而且 ProxyCreationEnabled 設定為 true,就會建立新的 POCO Proxy 物件,否則會建立泛型引數型別的物件。 這個方法的泛型引數可以是任何具象參考型別 (不支援抽象類別、介面和實值型別)。 如果泛型型別是未對應至概念模型的 CLR 型別,或不符合 Proxy 建立需求的型別,方法會嘗試使用已傳遞型別之任何無參數的建構函式,來建立及傳回型別的新執行個體。 除了 ObjectContext 上的 CreateObject,您可以對 ObjectSet 使用 CreateObjectCreateObject 方法。 如需詳細資訊,請參閱HOW TO:建立使用 Proxy 的 POCO 實體 (Entity Framework)

此方法並不會將建立的物件加入至物件內容。 若要將物件加入至內容,您必須使用 建立、加入、修改和刪除物件 主題中所述的方法。

ProxyCreationEnabled

將這個旗標設定為 true,Entity Framework 將嘗試為 POCO 實體建立 Proxy。 ProxyCreationEnabled 旗標預設會設定為 true

GetObjectType

System.Data.Objects.ObjectContext.GetObjectType(System.Type) 是靜態方法,如果已將 Proxy 型別傳遞做為引數的話,會傳回衍生指定之 Proxy 的來源 Proxy 型別。 如果傳遞非 Proxy 型別,這個方法會傳回相同的型別。

CreateProxyTypes

根據已載入 ObjectContext 內的中繼資料,建立指定之 POCO 型別的 Proxy 型別組。 此方法並不會執行個體化已建立之 Proxy 型別的物件。 例如,下列程式碼將建立 CustomerOrder POCO 類別的 Proxy:context.CreateProxyTypes(new Type[] { typeof(Customer), typeof(Order) });

當您從資料來源載入物件或載入使用 CreateObject 所建立之新物件時,Entity Framework 會在執行階段為您的 POCO 類別建立 Proxy 型別。 然而,其中可能會有您想事先建立 Proxy 型別的案例。 例如,在跨 AppDomain 界限序列化物件圖形時,您可能會想要確保該 Proxy 型別實際存在目標環境中。 如果型別不存在,還原序列化會失敗。

GetKnownProxyTypes

GetKnownProxyTypes 是會傳回列舉的靜態方法,該列舉會包含目前已在 AppDomain 中建立的所有 Proxy 型別。 在序列化案例中,您可以使用此方法來取得目標環境中應該已經包含而且序列化程式應該可辨識的所有型別。

本章節內容

建立 POCO Proxy 的需求 (Entity Framework)

載入相關的 POCO 實體 (Entity Framework)

追蹤 POCO 實體中的變更 (Entity Framework)

HOW TO:定義 POCO 實體 (Entity Framework)

HOW TO:定義自訂物件內容 (Entity Framework)

HOW TO:自訂模型與對應檔以搭配自訂物件運作 (Entity Framework)

HOW TO:定義自訂物件內容 (Entity Framework)

HOW TO:建立使用 Proxy 的 POCO 實體 (Entity Framework)

HOW TO:明確載入 POCO 實體 (Entity Framework)

HOW TO:偵測 POCO 實體中的變更

HOW TO:變更 POCO 實體之間的關聯性 (Entity Framework)

下面是有關 POCO 的一系列部落格文章,來自 ADO.NET (英文)。

POCO (英文)

Entity Framework 4 中的 POCO - 第 2 部 (英文)

Entity Framework 4 中的 POCO - 第 3 部 (英文)

另請參閱

概念

自訂物件 (Entity Framework)
定義及管理關聯性