WCF Data Services クライアント ライブラリを使用して Open Data Protocol (OData) フィードを操作する場合、フィード内のエントリがクライアント データ サービス クラスのインスタンスに変換されます。 これらのデータ サービス クラスは、DataServiceQuery<TElement> が属する DataServiceContext を使用して追跡されます。クライアントでは、DataServiceContext にメソッドを使用して報告する、エンティティへの変更が追跡されます。 これらのメソッドを使用すると、クライアントは、追加および削除されたエンティティの追跡に加えて、プロパティ値に対して行われた変更やエンティティ インスタンス間のリレーションシップに対して行われた変更を追跡できます。 追跡されたこれらの変更は、SaveChanges メソッドが呼び出されたときに、REST ベースの操作としてデータ サービスに送り返されます。
注意
DataServiceCollection<T> のインスタンスを使用してデータをコントロールにバインドする場合、バインドされたコントロールのデータに対して行われた変更は DataServiceContext に自動的に報告されます。詳細については、「コントロールへのデータのバインド (WCF Data Services)」を参照してください。
エンティティの追加および変更
Visual Studio の [サービス参照の追加] ダイアログを使用して OData フィードへの参照を追加した場合、結果のクライアント データ サービス クラスにはそれぞれ、静的な Create メソッドが作成されます。このメソッドは、null 非許容のエンティティ プロパティごとに 1 つのパラメーターを受け取ります。 このメソッドを使用すると、次の例に示すように、エンティティ型クラスのインスタンスを作成できます。
' Create the new product.
Dim newProduct = _
Product.CreateProduct(0, "White Tea - loose", False)
// Create the new product.
Product newProduct =
Product.CreateProduct(0, "White Tea - loose", false);
エンティティ インスタンスを追加するには、次の例に示すように、[サービス参照の追加] ダイアログ ボックスによって生成された DataServiceContext クラスで適切な AddTo メソッドを呼び出します。
' Add the new product to the Products entity set.
context.AddToProducts(newProduct)
// Add the new product to the Products entity set.
context.AddToProducts(newProduct);
オブジェクトがコンテキストおよび正しいエンティティ セットに追加されます。 AddObject を呼び出すこともできますが、エンティティ セット名を指定する必要があります。 追加したエンティティにその他のエンティティへの 1 つ以上のリレーションシップがある場合は、AddRelatedObject メソッドを使用するか、前のメソッドの 1 つを使用してこれらのリンクを明示的に定義することができます。 これらの操作の詳細については、このトピックの後半で説明します。
既存のエンティティ インスタンスを変更するには、まずそのエンティティをクエリし、このエンティティのプロパティに必要な変更を加えてから、オブジェクトの更新を送信する必要があることをクライアント ライブラリに示すために、次のように DataServiceContext で UpdateObject メソッドを呼び出します。
' Mark the customer as updated.
context.UpdateObject(customerToChange)
// Mark the customer as updated.
context.UpdateObject(customerToChange);
エンティティ インスタンスを削除するには、次の例に示すように、DataServiceContext で DeleteObject メソッドを呼び出します。
' Mark the product for deletion.
context.DeleteObject(deletedProduct)
// Mark the product for deletion.
context.DeleteObject(deletedProduct);
詳細については、「方法: エンティティを追加、変更、および削除する (WCF Data Services)」を参照してください。
エンティティのアタッチ
クライアント ライブラリでは、クエリを実行してエンティティを DataServiceContext に読み込むことなく、エンティティに対して行った変更を保存できます。 AttachTo メソッドを使用して、既存のオブジェクトを DataServiceContext の特定のエンティティ セットにアタッチします。 その後、オブジェクトを変更して、変更内容をデータ サービスに保存できます。 次の例では、変更された顧客オブジェクトがコンテキストにアタッチされた後、SaveChanges が呼び出される前に、UpdateObject が呼び出され、アタッチされたオブジェクトが Modified としてマークされます。
' Attach the existing customer to the context and mark it as updated.
context.AttachTo("Customers", customer)
context.UpdateObject(customer)
' Send updates to the data service.
context.SaveChanges()
// Attach the existing customer to the context and mark it as updated.
context.AttachTo("Customers", customer);
context.UpdateObject(customer);
// Send updates to the data service.
context.SaveChanges();
オブジェクトをアタッチする際は、次の点に注意してください。
オブジェクトは、Unchanged 状態でアタッチされます。
オブジェクトがアタッチされるとき、アタッチされるオブジェクトに関連付けられたオブジェクトはアタッチされません。
エンティティがコンテキストによって既に追跡されている場合は、オブジェクトをアタッチできません。
eTag 値と一緒に受け取ったエンティティ オブジェクトをアタッチした場合は、AttachTo(String, Object, String) メソッドの、etag パラメーターを受け取るオーバーロードが使用されます。 この eTag 値は、アタッチされたオブジェクトへの変更を保存したときに、同時実行をチェックするために使用されます。
詳細については、「方法: 既存のエンティティを DataServiceContext にアタッチする (WCF Data Services)」を参照してください。
リレーションシップ リンクの作成および変更
[サービス参照の追加] ダイアログで生成された DataServiceContext クラスの AddObject メソッド、または適切な AddTo メソッドを使用して新しいエンティティを追加する場合、新しいエンティティと関連付けられたエンティティの間のリレーションシップの自動定義は行われません。
エンティティ インスタンス間のリレーションシップを作成および変更し、クライアント ライブラリにこれらの変更をデータ サービスに反映できます。 エンティティ間のリレーションシップは、モデル内の関連付けとして定義されています。また、DataServiceContext は、各リレーションシップをコンテキスト内のリンク オブジェクトとして追跡します。 WCF Data Services は、DataServiceContext クラスで、これらのリンクを作成、変更、および削除する以下のメソッドを提供します。
メソッド |
説明 |
---|---|
関連付けられた 2 つのエンティティ オブジェクトの間に新しいリンクを作成します。 このメソッドを呼び出すことは、AddObject(String, Object) と AddLink(Object, String, Object) を呼び出して、新しいオブジェクトを作成すること、および既存のオブジェクトへのリレーションシップを定義することと同じです。 |
|
関連付けられた 2 つのエンティティ オブジェクトの間に新しいリンクを作成します。 |
|
関連付けられた 2 つのエンティティ オブジェクト間の既存のリンクを更新します。 また、SetLink(Object, String, Object) は、0 または 1 対 1 (0..1:1) および 1 対 1 (1:1) の基数を持つリンクの削除にも使用します。 これを行うには、関連付けられたオブジェクトを null に設定します。 |
|
SaveChanges メソッドが呼び出されたときに、コンテキストが追跡するリンクに削除のマークを付けます。 このメソッドは、関連付けられたオブジェクトを削除する場合、または既存のオブジェクトへのリンクを削除した後に関連付けられた新しいオブジェクトへのリンクを追加してリレーションシップを変更する場合に使用します。 |
|
2 つのエンティティ オブジェクトの間の既存のリンクのコンテキストを通知します。 コンテキストでは、このリレーションシップがデータ サービス内に既に存在するものと見なされるので、SaveChanges メソッドを呼び出してもリンクは作成されません。 このメソッドは、2 つのオブジェクトをコンテキストにアタッチして、オブジェクト間のリンクもアタッチする必要がある場合に使用します。 新しいリレーションシップを定義する場合は、AddLink を使用してください。 |
|
コンテキストでの指定リンクの追跡を停止します。 このメソッドは、一対多 (*:*) のリレーションシップの削除に使用します。 基数が 1 のリレーションシップ リンクの場合は、SetLink(Object, String, Object) を代わりに使用する必要があります。 |
注意
Entity Framework プロバイダーを含むほとんどのデータ サービス プロバイダーは、データ モデル内のエンティティ間のリレーションシップを双方向として扱います。たとえば、Customers エンティティと Orders エンティティの間のアソシエーションは、顧客 (customer) と 1 つ以上の注文 (order) の間のリレーションシップ、および 1 つの注文とその注文が属する顧客の間のリレーションシップの両方を表します。データ サービス プロバイダーが新しいリレーションシップのどちらの方向も作成しない場合は、SetLink(Object, String, Object) メソッドを AddLink(Object, String, Object) と共に呼び出して、リレーションシップの両方向を定義する必要があります。
次の例は、AddRelatedObject メソッドを使用して、既存の Orders エンティティに関連付けられた新しい Order_Detail を追加する方法を示します。 新しい Order_Details オブジェクトは DataServiceContext によって追跡されるので、既存の Products エンティティと追加された Order_Details オブジェクトのリレーションシップは、AddLink メソッドを呼び出すことによって定義されます。
' Add the new item with a link to the related order.
context.AddRelatedObject(order, "Order_Details", newItem)
// Add the new item with a link to the related order.
context.AddRelatedObject(order, "Order_Details", newItem);
AddLink メソッドは、データ サービス内に作成する必要のあるリンクを定義しますが、これらのリンクをコンテキスト内のオブジェクトに反映させるには、オブジェクト自身でナビゲーション プロパティを設定する必要があります。 前の例では、次のようにナビゲーション プロパティを設定します。
' Add the new order detail to the collection, and
' set the reference to the product.
order.Order_Details.Add(newItem)
newItem.Order = order
newItem.Product = selectedProduct
// Add the new order detail to the collection, and
// set the reference to the product.
order.Order_Details.Add(newItem);
newItem.Order = order;
newItem.Product = selectedProduct;
詳細については、「方法: エンティティ リレーションシップを定義する (WCF Data Services)」を参照してください。
変更の保存
変更は、DataServiceContext インスタンスで追跡されますが、サーバーには直ちに送信されません。 指定されたアクティビティに対して必要な変更が完了した後、SaveChanges を呼び出して、すべての変更をデータ サービスに送信します。 詳細については、「データ サービス コンテキストの管理 (WCF Data Services)」を参照してください。 変更は、BeginSaveChanges および EndSaveChanges メソッドを使用して、非同期で保存することもできます。 詳細については、「非同期操作 (WCF Data Services)」を参照してください。
関連項目
概念
データ サービスのクエリ (WCF Data Services)
オブジェクトの具体化 (WCF Data Services)
データ サービス コンテキストの管理 (WCF Data Services)