オブジェクトの具体化 (WCF Data Services)

[サービス参照の追加] ダイアログを使用して .NET Framework ベースのクライアント アプリケーションの Open Data Protocol (OData) フィードを使用すると、フィードによって公開されるデータ モデルの各エンティティ型に対して同等のデータ クラスが生成されます。 詳細については、「クライアント データ サービス クラスの生成 (WCF Data Services)」を参照してください。 クエリによって返されるエンティティ データは、これらの生成されたクライアント データ サービス クラスのいずれかのインスタンスに具体化されます。 マージ オプションおよび追跡オブジェクトの ID 解決については、「データ サービス コンテキストの管理 (WCF Data Services)」を参照してください。

さらに WCF Data Services では、ツールによって生成されたデータ クラスを使用する代わりに、独自のクライアント データ サービス クラスを定義できます。 これにより、"plain-old CLR object" (POCO) データ クラスとして知られる独自のデータ クラスを使用できます。 これらの型のカスタム データ クラスを使用する際は、データ クラスを DataServiceKeyAttribute または DataServiceEntityAttribute で属性化し、クライアント上のその型名がデータ サービスのデータ モデル内の型名と一致するようにする必要があります。

クエリ応答のエンティティの具体化

ライブラリではクエリ応答メッセージを受け取ると、OData フィードから返されたデータを、クエリの型のクライアント データ サービス クラスのインスタンスに具体化します。 これらのオブジェクトを具体化する一般的なプロセスは次のとおりです。

  1. クライアント ライブラリは、応答メッセージ フィード内の entry 要素からシリアル化された型を読み取り、次のいずれかの方法で正しい型の新しいインスタンスの作成を試みます。

    • フィードで宣言された型の名前が DataServiceQuery<TElement> の型と同じ場合は、空のコンストラクターを使用してこの型の新しいインスタンスが作成されます。

    • フィードで宣言された型の名前が DataServiceQuery<TElement> の型から派生した型と同じ場合は、空のコンストラクターを使用して派生したこの型の新しいインスタンスが作成されます。

    • フィードで宣言された型が DataServiceQuery<TElement> の型、または派生した型と一致しない場合は、空のコンストラクターを使用してクエリされた型の新しいインスタンスが作成されます。

    • ResolveType プロパティが設定されている場合、指定されたデリゲートが呼び出され、既定の名前ベースの型のマッピングを上書きし、Func<T, TResult> によって返された型の新しいインスタンスが代わりに作成されます。 このデリゲートが NULL 値を返した場合、クエリされた型の新しいインスタンスが代わりに作成されます。 継承のシナリオをサポートするために、既定の名前ベースの型名のマッピングを上書きすることが必要な場合があります。

  2. クライアント ライブラリは entry の id 要素から URI 値を読み取ります。これがエンティティの ID 値です。 NoTrackingMergeOption 値が使用されない限り、DataServiceContext のオブジェクトの追跡には、ID 値が使用されます。 さらに、クエリ応答でエンティティが複数回返されたときでも、単一のエンティティ インスタンスのみが作成されることを保証するためにも ID 値を使用します。

  3. クライアント ライブラリは、フィード エントリからプロパティを読み取り、新しく作成されたオブジェクトに対応するプロパティを設定します。 DataServiceContext に同じ ID 値のオブジェクトが既に存在する場合、プロパティは、DataServiceContextMergeOption 設定に基づき設定されます。 応答には、クライアント型で対応するプロパティがないプロパティ値が含まれる場合があります。 そのような場合、アクションは、DataServiceContextIgnoreMissingProperties プロパティの値によって異なります。 このプロパティが true に設定されている場合は、欠落しているプロパティは無視されます。 それ以外の場合は、エラーが発生します。 プロパティは次のように設定されます。

    • スカラー プロパティは、応答メッセージのエントリ内の対応する値に設定されます。

    • 複合プロパティは、新しい複合型インスタンスに設定されます。このインスタンスは、応答からの複合型のプロパティとともに設定されます。

    • 関連するエンティティのコレクションを返すナビゲーション プロパティは、ICollection<T> の新しいまたは既存のインスタンスに設定されます。ここで、T は関連エンティティの型です。 このコレクションは、関連オブジェクトが DataServiceContext に読み込まれていない限り空になります。 詳細については、「遅延コンテンツの読み込み (WCF Data Services)」を参照してください。

      注意

      生成されたクライアント データ クラスでデータ バインディングがサポートされる場合、ナビゲーション プロパティは代わりに DataServiceCollection<T> クラスのインスタンスを返します。詳細については、「コントロールへのデータのバインド (WCF Data Services)」を参照してください。

  4. ReadingEntity イベントが発生します。

  5. クライアント ライブラリは DataServiceContext にオブジェクトをアタッチします。 MergeOptionNoTracking の場合は、オブジェクトはアタッチされません。

関連項目

概念

データ サービスのクエリ (WCF Data Services)

クエリ射影 (WCF Data Services)