建置 N-Tier 應用程式

Entity Framework 支援將實體物件序列化成可進行實體物件的遠端與訊息式交換的格式,例如與 Web 服務和 Windows Communication Foundation (WCF) 搭配使用的格式。 物件可以使用二進位序列化、XML 序列化和 WCF 資料合約序列化來進行序列化,以便使用二進位資料流或訊息式通訊協定進行傳輸。 如需詳細資訊,請參閱序列化物件 (Entity Framework)。 物件也可以從訊息或資料流擷取、還原序列化,然後再附加到物件內容。 如需詳細資訊,請參閱附加及中斷連結物件

WCF 資料服務讓您以應用程式可以使用的 XML 格式來提供實體資料的動態存取。 使用標準具像狀態傳輸 (REST) HTTP 動作 (例如 GET、PUT 和 POST) 存取這種實體資料。 如需詳細資訊,請參閱 WCF Data Services

下列考量適用於使用 Entity Framework 的 Web 服務或 WCF 服務:

  • 使用二進位序列化和資料合約序列化,相關的物件就會與主要物件一起序列化。 XML 序列化不會序列化相關物件。 序列化實體時,請停用消極式載入。 消極式載入會針對每個存取之關聯性導覽屬性執行查詢,而且二進位序列化程式和 WCF 資料合約序列化程式會存取所有關聯性導覽屬性。 這可能會造成很多未預期的查詢在序列化期間執行。 如需詳細資訊,請參閱序列化物件 (Entity Framework)

  • 建議採用無狀態服務。 服務應設計成只在要求或回應期間維持物件內容。 訊息交換模式應包括足夠的資訊,以便在套用變更時不必保存物件或重新查詢資料來源以擷取原始物件。 舉例來講,允許用戶端更新物件的服務應該要求所更新的物件與原始物件一起傳回。 這樣就能讓 Web 服務將變更套用到原始物件,而不用從資料庫擷取原始物件或將它保存在記憶體中。 如需詳細資訊,請參閱 HOW TO:套用對中斷連結的物件所做的變更 (Entity Framework)

  • 物件永遠是在 Detached 狀態進行序列化。 您可能需要將物件附加或加入到 ObjectContext,或者只是將屬性變更套用到原始物件。 如需詳細資訊,請參閱附加及中斷連結物件

  • 一旦將物件及關聯性加入至內容中,您便可以使用 ChangeObjectState (例如 AddedModified) 來設定新狀態。

  • 您必須手動管理並行存取及驗證。

如需詳細資訊,請參閱下列多層式架構開發相關文件:

避免多層式架構應用程式的反向模式

多層式架構應用程式模式

自我追蹤實體

在 Entity Framework 應用程式中,物件內容是負責追蹤您物件中的變更。 不過,當您必須在無法使用物件內容的另一層中操作物件時,您必須決定如何追蹤變更及將這些變更回報物件內容。 從 .NET Framework 4 版開始,自行追蹤式實體可協助您追蹤任何層中的變更。 自我追蹤實體是根據「文字範本轉換工具組」(Text Template Transformation Toolkit,T4) 範本建置而成的實體,該範本產生的實體類型能夠記錄純量、複雜和導覽屬性的變更。 如需詳細資訊,請參閱使用自我追蹤實體

若要在不使用自我追蹤實體的情況下,在未將物件附加至物件內容的層上追蹤變更,您可以使用下一節中的方法來協助您更新內容,以便將相關變更保存至資料庫。

使用與 N-Tier 應用程式開發相關的 API

下列方法可讓您加入完整的物件圖形,然後逐步查看該圖形,將適當值套用至物件屬性,然後在實體物件和關聯性設定正確的狀態。

若要加入及附加實體,請使用下列方法:

成員 說明

System.Data.Objects.ObjectSet.AddObject(

System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

將物件及其相關物件加入至 ObjectContext 並將實體物件設定為 Added 狀態。 在這個狀態下,實體物件不需要具備唯一的索引鍵值。 儲存物件之後,暫存的索引鍵值會指派給索引鍵屬性,然後再更新為資料來源產生之值。 在加入物件之後,請適當變更實體物件的狀態。

System.Data.Objects.ObjectSet.Attach(

System.Data.Objects.ObjectContext.Attach(System.Data.Objects.DataClasses.IEntityWithKey)

AttachTo

將物件加入至 ObjectContext 並將物件設定為 Unchanged 狀態。 在 Unchanged 狀態下,Entity Framework 會將實體索引鍵值視為最終的值。 如果特定型別的多個實體具有相同的索引鍵值,Entity Framework 將會擲回例外狀況。 若要避免得到例外狀況,請使用 AddObject 方法來附加已中斷連結的物件,然後適當變更狀態。

若要變更純量值,請使用下列方法:

成員 說明

System.Data.Objects.ObjectSet.ApplyCurrentValues(

System.Data.Objects.ObjectContext.ApplyCurrentValues.String,

將純量值從提供的物件複製到 ObjectContext 中具有相同索引鍵的物件。 任何與原始值不同的值將標示為已修改。

如果您有一個使用目前值的圖形,而您想要套用原始值,請呼叫 ApplyOriginalValues 方法。

您也可以使用 ObjectStateEntryApplyCurrentValues 方法。

System.Data.Objects.ObjectSet.ApplyOriginalValues(

System.Data.Objects.ObjectContext.ApplyOriginalValues.String,

從提供的物件將純量值複製至 ObjectContext 中具有相同索引鍵之物件的原始值組。 任何與目前值不同的值將標示為已修改。

您也可以使用 ObjectStateEntryApplyOriginalValues 方法。

SetModifiedProperty

將個別屬性設定為 Modified 狀態。 當您知道哪些屬性已修改時請使用這個屬性,而不是將整個實體設定為已修改。

GetUpdatableOriginalValues

取得 OriginalValueRecord 執行個體,其代表與這個 ObjectStateEntry 關聯之物件的原始值的可更新版本。 使用傳回之 OriginalValueRecord 執行個體來個別讀取或更新物件的原始屬性。

CurrentValues

取得 CurrentValueRecord 執行個體,其代表與這個 ObjectStateEntry 關聯之物件的目前值。 使用傳回之 CurrentValueRecord 執行個體來個別讀取或更新物件的目前屬性。

若要變更實體及關聯性狀態,請使用下列方法:

成員 描述

ChangeObjectState

將實體或關聯性變更為新狀態 (例如 AddedModified)。 這項變更可能會影響實體所參與的關聯性。例如,將實體移至 Added 狀態也會將任何未變更的關聯性移至 Added 狀態。 同樣地,將實體標示為 Modified 會將所有純量值標示為 Modified

您也可以使用 ObjectStateEntryChangeState 方法。

ChangeRelationshipState

將兩個實體之間現有的關聯性變更為指定的狀態。 如果兩個實體之間沒有關聯性,這個方法會依指定的狀態建立新的關聯性。 以外部索引鍵關聯為基礎的關聯性不支援這個方法。 如需詳細資訊,請參閱定義及管理關聯性

您也可以使用 ObjectStateEntryChangeState 方法。

ChangeState

這個方法的行為會和 ChangeObjectStateChangeRelationshipState 相同,需視 ObjectStateEntry 是一個物件或關聯性而定。

SetModifiedProperty

將個別屬性設定為 Modified 狀態。 當您知道哪些屬性已修改時請使用這個方法,而不是將整個實體設定為已修改。

若要將變更儲存回資料來源,請使用下列方法:

成員 描述

SaveChanges

將所有變更保存至資料來源。

如果您想要在具體化物件期間取得或設定部分資訊或訂閱部分事件,請使用 ObjectMaterialized 事件。

成員 描述

ObjectMaterialized

在查詢或載入作業中,從資料來源中的資料建立新的實體物件時發生。 在載入參考物件之後,但載入集合之前引發此事件。 如果內容中已有物件使用相同的索引鍵值,Entity Framework 將不會重新建立物件,而且不會引發此事件。

另請參閱

概念

使用物件