共用方式為


物件具體化 (WCF Data Services)

當您使用 [加入服務參考] 對話方塊,在 .NET Framework 架構用戶端應用程式中取用 Open Data Protocol (OData) 摘要時,將會針對資料模型中此摘要所公開的每一個實體類型產生同等的資料類別。如需詳細資訊,請參閱產生資料服務用戶端程式庫 (WCF 資料服務)。查詢所傳回之實體資料會具體化為其中一個產生之用戶端資料服務類別的執行個體。如需追蹤物件之合併選項和識別解析的詳細資訊,請參閱 管理資料服務內容 (WCF Data Services)。 

WCF Data Services 還能讓您定義自己的用戶端資料服務類別,而不必使用工具產生的資料類別。這可讓您使用自己的資料類別,也就是「單純的 CLR 物件」(POCO) 資料類別。使用這些自訂資料類別型別時,您應該使用 DataServiceKeyAttributeDataServiceEntityAttribute 將資料類別屬性化,並確保用戶端上的型別名稱與資料服務之資料模型中的型別名稱相符。

程式庫接收查詢回應訊息後,它會將傳回的資料從 OData 摘要具體化為用戶端資料服務類別的執行個體,而該執行個體屬於查詢的型別。具體化這些物件的一般程序如下所示:

  1. 用戶端程式庫會從回應訊息摘要中的 entry 項目讀取序列化的型別,並嘗試利用下列其中一種方式建立正確型別的新執行個體:

    • 當摘要中宣告的型別所使用的名稱與 DataServiceQuery 的型別使用的名稱相同時,會使用空的建構函式來建立此型別的新執行個體。

    • 當摘要中宣告的型別所使用的名稱與衍生自 DataServiceQuery 的型別所使用的名稱相同時,會利用空的建構函式來建立此衍生型別的新執行個體。

    • 當摘要中宣告的型別與 DataServiceQuery 的型別或任何衍生型別不相符時,會利用空的建構函式來建立所查詢型別的新執行個體。

    • 如果已設定 ResolveType 屬性,會呼叫提供的委派來覆寫預設的名稱架構型別對應,並建立由 Func 傳回之型別的新執行個體來代替。如果這個委派傳回 null 值,會建立所查詢型別的新執行個體來代替。可能必須覆寫預設的名稱架構型別名稱對應來支援繼承案例。

  2. 用戶端程式庫會讀取 entryid 項目的 URI 值,它就是實體的識別值。除非使用 NoTrackingMergeOption 值,否則會使用識別值來追蹤 DataServiceContext 中的物件。識別值也會用來保證只會建立單一實體執行個體,甚至當某個實體在查詢回應中被傳回多次時也一樣。

  3. 用戶端程式庫會讀取摘要項目中的屬性,並在新建立的物件上設定對應的屬性。當 DataServiceContext 中已存在與物件所具備之相同的識別值時,會根據 DataServiceContextMergeOption 設定來設定屬性。若某對應的屬性不存在用戶端型別中,則回應可能會包含屬性值。若發生這種情況,動作會視 DataServiceContextIgnoreMissingProperties 屬性而定。當這個屬性設定為 true 時,會忽略遺漏的屬性。否則,就會引發錯誤。屬性設定如下所示:

    • 純量屬性會設定為回應訊息之項目中的對應值。

    • 複雜屬性會設定為新的複雜型別執行個體,其會與回應中的複雜型別屬性一起設定。

    • 導覽屬性會傳回相關實體的集合,它們會設定為新的或現有之 ICollection 的執行個體,其中 T 指相關實體的類型。除非已將相關物件載入 DataServiceContext,否則這是一個空的集合。如需詳細資訊,請參閱載入延後的內容 (WCF 資料服務)

      Ee473428.note(zh-tw,VS.100).gif注意:
      當產生之用戶端資料類別支援資料繫結時,導覽屬性會傳回 DataServiceCollection 類別的執行個體來代替。如需詳細資訊,請參閱將資料繫結至控制項 (WCF 資料服務)

  4. 便會引發 ReadingEntity 事件。

  5. 用戶端程式庫會將物件附加至 DataServiceContext。當 MergeOptionNoTracking 時,不會附加物件。

另請參閱

概念

查詢資料服務 (WCF Data Services)
查詢投影 (WCF 資料服務)