管理資料服務內容 (WCF Data Services)
注意: |
---|
本主題描述 WCF Data Services 中的新功能。此新功能會支援 Open Data Protocol (OData) 3 版而且可做為 .NET Framework 4 版的更新使用。您可以從 Microsoft 下載中心下載及安裝更新。 |
DataServiceContext 類別會封裝針對特定資料服務支援的作業。雖然 OData 服務沒有狀態,但是內容具有狀態。因此,您可以使用 DataServiceContext 類別,在用戶端上維護與資料服務互動之間的狀態,以便支援變更管理之類的功能。這個類別也可以管理識別及追蹤變更。
合併選項和識別解析
當執行 DataServiceQuery 時,回應摘要中的實體會具體化成為物件。如需詳細資訊,請參閱物件具體化 (WCF Data Services)。回應訊息中的項目具體化成為物件的方式是根據識別解析來執行,而且會取決於執行查詢時所使用的合併選項。如果在單一 DataServiceContext 的範圍中執行多個查詢或載入要求,則 WCF Data Services 用戶端只會追蹤具有特定索引鍵值之物件的單一執行個體。用來執行識別解析的這個索引鍵會唯一識別實體。
根據預設,用戶端只會將回應摘要中的項目具體化成為實體的物件,而這些實體尚未被 DataServiceContext 所追蹤。這表示,已經在快取中之物件的變更不會遭到覆寫。這個行為的控制方式,是針對查詢和載入作業指定 MergeOption 值。這個選項的指定方式是在 DataServiceContext 上設定 MergeOption 屬性。預設的合併選項值是 AppendOnly。這樣只會具體化尚未被追蹤之實體的物件,這表示現有的物件不會遭到覆寫。有另一個方式可避免用戶端的物件變更遭到資料服務中的更新所覆寫,就是指定 PreserveChanges。當您指定 OverwriteChanges 時,將會使用回應摘要中項目的最新值來取代用戶端的物件值,即使這些物件已有變更亦然。當使用 NoTracking 合併選項時,DataServiceContext 無法將用戶端物件所做的變更傳送給資料服務。使用這個選項時,一定會使用資料服務中的值來覆寫變更。
管理並行存取
OData 支援可讓資料服務偵測更新衝突的開放式並行存取。可以透過一種方式來設定資料服務提供者,讓資料服務使用並行語彙基元來檢查實體的變更。這個語彙基元包含實體類型的一個或多個屬性,資料服務會驗證這些屬性以判斷資源是否已變更。WCF Data Services 用戶端會為您管理並行語彙基元 (包含在與資料服務之間的要求與回應的 eTag 標頭中)。如需詳細資訊,請參閱更新資料服務 (WCF Data Services)。
DataServiceContext 會追蹤使用 AddObject、UpdateObject 和 DeleteObject 或是 DataServiceCollection 所手動提報的物件變更。呼叫 SaveChanges 方法時,用戶端會將變更傳回資料服務。當用戶端的資料變更與資料服務的變更發生衝突時,SaveChanges 可能會失敗。當發生這個狀況時,您必須再次查詢實體資源,以接收更新資料。若要覆寫資料服務中的變更,請使用 PreserveChanges 合併選項執行查詢。當您再次呼叫 SaveChanges 時,用戶端所保留的變更會保存到資料服務,前提是尚未針對資料服務中的資源進行其他變更。
儲存變更
變更會在 DataServiceContext 執行個體中追蹤,但是不會立即傳送至伺服器。在針對指定的活動完成所需的變更之後,請呼叫 SaveChanges,將所有變更提交至資料服務。SaveChanges 作業完成後,會傳回 DataServiceResponse 物件。DataServiceResponse 物件包含一連串的 OperationResponse 物件,其中依序包含一連串的 EntityDescriptor 或 LinkDescriptor 執行個體,表示持續性或嘗試性的變更。在資料服務中建立或修改實體時,EntityDescriptor 會包括已更新實體的參考,其中包含任何伺服器產生的屬性值,例如以上範例中產生的 ProductID
值。用戶端程式庫會自動更新 .NET Framework 物件以便擁有這些新值。
對於成功插入和更新的作業,與作業相關聯的 EntityDescriptor 或 LinkDescriptor 物件之狀態屬性會設定為 Unchanged,而新值則是使用 OverwriteChanges 來合併。當資料服務中的插入、更新或刪除作業失敗時,實體狀態會維持不變,與呼叫 SaveChanges 之前相同,而且 OperationResponse 的 Error 屬性會設定為 DataServiceRequestException,其中包含與該錯誤有關的資訊。如需詳細資訊,請參閱更新資料服務 (WCF Data Services)。
設定更新的 HTTP 方法
.NET Framework 用戶端程式庫預設會將更新當做 MERGE 要求,傳送到現有的實體。MERGE 要求會更新選取的實體屬性,不過在 MERGE 要求中,用戶端永遠會加入所有的屬性 (甚至是尚未變更的屬性)。OData 通訊協定也支援傳送 PUT 要求來更新實體。在 PUT 要求中,現有的實體基本上會從用戶端取代成具有屬性值的新實體執行個體。若要使用 PUT 要求,請在呼叫 SaveChanges 時,設定 SaveChangesOptions 列舉上的 ReplaceOnUpdate 旗標。
注意: |
---|
當用戶端不知道實體的所有屬性時,PUT 要求與 MERGE 要求的行為將會有所不同。將實體型別投影到用戶端上的新型別時,可能會發生這個情況。將新屬性加入至服務資料模型中的實體,而且 DataServiceContext 上的 IgnoreMissingProperties 屬性設為 true 來忽略此類用戶端對應錯誤時,也可能會發生這個情況。在這些情況下,PUT 要求會將用戶端不知道的任何屬性重設為其預設值。 |
另請參閱
概念
更新資料服務 (WCF Data Services)
非同步作業 (WCF 資料服務)
批次作業 (WCF 資料服務)