データ サービス コンテキストの管理 (WCF Data Services)

Gg602811.note(ja-jp,VS.100).gif注 :
このトピックでは、WCF Data Services の新機能について説明します。この新機能では、Open Data Protocol (OData) の Version 3 がサポートされています。この機能は、.NET Framework Version 4 の更新プログラムによって利用可能になります。更新プログラムは、Microsoft ダウンロード センターからダウンロードしてインストールできます。

DataServiceContext クラスは、特定のデータ サービスに対してサポートされている操作をカプセル化します。OData サービスはステートレスですが、コンテキストはステートレスではありません。このため DataServiceContext クラスを使用すると、変更管理などの機能をサポートするためにデータ サービスとの対話操作間におけるクライアントの状態を保持できます。このクラスは、ID の管理と変更の追跡も行います。

マージ オプションおよび ID 解決

DataServiceQuery が実行されると、応答フィードのエンティティはオブジェクトに具体化されます。詳細については、「オブジェクトの具体化 (WCF Data Services)」を参照してください。応答メッセージのエントリがオブジェクトに具体化される方法は、ID 解決に基づいて実行され、クエリが実行された際のマージ オプションによって決まります。複数のクエリまたは読み込み要求が単一の DataServiceContext のスコープで実行される場合、WCF Data Services クライアントは特定のキー値を持つオブジェクトの単一のインスタンスのみを追跡します。このキーは、ID 解決の実行に使用され、エンティティを一意に識別します。

既定では、クライアントは DataServiceContext によってまだ追跡されていないエンティティのオブジェクトに応答フィードのエントリを具体化するだけです。これは、既にキャッシュ内にあるオブジェクトに対する変更は上書きされないことを意味します。この動作は、クエリおよび読み込み操作に MergeOption 値を指定することによって制御されます。このオプションを指定するには、DataServiceContextMergeOption プロパティを設定します。既定のマージ オプションの値は AppendOnly です。この既定値を設定した場合、まだ追跡されていないエンティティのオブジェクトのみが具体化されます。これは、既存のオブジェクトが上書きされないことを意味します。クライアントのオブジェクトに対する変更がデータ サービスからの更新によって上書きされないようにするもう 1 つの方法は、PreserveChanges を指定する方法です。OverwriteChanges を指定した場合、クライアントのオブジェクトの値は、既に変更が加えられていても、応答フィードのエントリの最新の値によって置換されます。NoTracking マージ オプションを使用する場合、DataServiceContext はクライアント オブジェクトに加えられた変更をデータ サービスに送信できません。このオプションを使用すると、変更は常にデータ サービスの値によって上書きされます。

同時実行の管理

OData では、オプティミスティック同時実行制御がサポートされており、データ サービスで更新の競合を検出できます。データ サービス プロバイダーは、データ サービスで同時実行トークンを使用してエンティティへの変更をチェックするように構成できます。このトークンには、リソースが変更されているかどうかを決定するためにデータ サービスによって検証されるエンティティ型の 1 つ以上のプロパティが含まれています。同時実行トークンは、データ サービスへの要求およびデータ サービスからの応答の eTag ヘッダーに含まれ、WCF Data Services クライアントによって管理されます。詳細については、「データ サービスの更新 (WCF Data Services)」を参照してください。

DataServiceContext は、AddObjectUpdateObject、および DeleteObject を使用して手動で報告しているか、または DataServiceCollection によって報告されているオブジェクトへの変更を追跡します。SaveChanges メソッドを呼び出すと、クライアントは、データ サービスに変更を送り返します。SaveChanges は、クライアントでのデータ変更がデータ サービスでの変更と競合する場合に失敗する可能性があります。このような状況が発生した場合、エンティティ リソースに対してクエリを再度実行し、更新データを受信する必要があります。データ サービスの変更を上書きするには、PreserveChanges マージ オプションを使用してクエリを実行します。SaveChanges を再度呼び出すと、データ サービスのリソースに対してその他の変更がまだ行われていない場合に限り、クライアントに保存されている変更がデータ サービスに永続化されます。

変更の保存

変更は、DataServiceContext インスタンスで追跡されますが、サーバーには直ちに送信されません。指定されたアクティビティに対して必要な変更が完了した後、SaveChanges を呼び出して、すべての変更をデータ サービスに送信します。SaveChanges 操作が完了した後、DataServiceResponse オブジェクトが返されます。DataServiceResponse オブジェクトには、OperationResponse オブジェクトのシーケンスが含まれます。さらに、これらの各オブジェクトには、永続化または試行された変更を表す、EntityDescriptor インスタンスまたは LinkDescriptor インスタンスのシーケンスが含まれます。データ サービス内でエンティティが作成または変更されると、前の例で生成された ProductID 値のようなサーバー生成のプロパティ値も含めて、更新されたエンティティへの参照が EntityDescriptor に含められます。クライアント ライブラリは、これらの新しい値を持つように .NET Framework オブジェクトを自動的に更新します。

挿入操作と更新操作を適切に実行するため、その操作に関連付けられている EntityDescriptor オブジェクトまたは LinkDescriptor オブジェクトの状態プロパティが Unchanged に設定され、新しい値は OverwriteChanges を使用してマージされます。データ サービス内で挿入、更新、または削除操作が失敗した場合、エンティティ状態は、SaveChanges が呼び出される前と同じままになり、OperationResponseError プロパティは、エラーに関する情報を含む DataServiceRequestException に設定されます。詳細については、「データ サービスの更新 (WCF Data Services)」を参照してください。

更新用の HTTP メソッドの設定

既定では、更新は、.NET Framework クライアント ライブラリから既存のエンティティに MERGE 要求として送信されます。MERGE 要求では、エンティティの選択されたプロパティが更新されますが、クライアントは、常に、変更されていないプロパティを含むすべてのプロパティを MERGE 要求に含めます。OData プロトコルは、エンティティを更新する PUT 要求の送信もサポートしています。PUT 要求では、既存のエンティティが、クライアントからのプロパティ値を含むエンティティの新しいインスタンスによって本質的に置き換えられます。PUT 要求を使用するには、SaveChanges を呼び出すときに ReplaceOnUpdate フラグを SaveChangesOptions 列挙体に設定します。

Gg602811.note(ja-jp,VS.100).gif注 :
クライアントがエンティティの一部のプロパティを認識していない場合、PUT 要求は MERGE 要求とは異なる動作になります。この状況は、クライアントでエンティティ型を新しい型に射影する場合に発生することがあります。また、新しいプロパティがサービス データ モデルのエンティティに追加されており、このようなクライアントのマッピング エラーを無視するように DataServiceContextIgnoreMissingProperties プロパティが true に設定されている場合にも発生することがあります。この場合、PUT 要求では、クライアントが認識していないすべてのプロパティが既定値にリセットされます。

参照

概念

データ サービスの更新 (WCF Data Services)
非同期操作 (WCF Data Services)
バッチ処理 (WCF Data Services)

その他のリソース

WCF Data Services クライアント ライブラリ