7

私は、WCF データ サービスによって提供される OData サービスを使用して、単純なシナリオだと思っていたものを実装しようとしています (今のところ、OData V3 application/json;odata=verbose ペイロード形式を使用します。将来的には JSON Light 形式を使用する可能性があります)。 . 基本的なシナリオは次のようになります。

私は2つのエンティティを持っています:

class Person 
{ 
  public int ID { get; set; }
  public string Name { get; set; } 
  public virtual PersonCategory Category { get; set; }
}

class PersonCategory
{
  public int ID { get; set; }
  public string Description { get; set; }
  public virtual ICollection<Person> People { get; set; }
}

ここで、Person の簡単な編集ページを作成したいと思います。この編集ページには、名前の入力と、人物のカテゴリの入力またはドロップダウンがある場合があります。

したがって、シナリオは次のようになります。

  1. コードは、カテゴリに $expand を使用して Person をダウンロードします: GET /api.svc/People(1)?$expand=Category
  2. ユーザーは、個人の Name プロパティとそのカテゴリの両方を編集します。
  3. ページのコードは、その人の名前とカテゴリのプロパティを更新する単一の要求を作成します。

ここでの鍵は「単一の要求」にあります。これは、ドキュメントを見つけるのに苦労している部分です。上記の 3 番を 2 つのリクエストに分割する例を見てきました。このようなもの (正確な形式は覚えていません。PUT を実行する前にカテゴリ リンクを削除する必要があるかどうかもわかりません):

PATCH /api.svc/People(1) with content: {"Name": "new name" }
PUT /api.svc/People(1)/$links/Category with content: { "url": "/api.svc/Categories(2)" }

しかし、Person エンティティへの他の変更とインラインで指定された Category ナビゲーション プロパティへの変更を使用して、この更新を単一の要求として実装することが可能であると言われていますが、実証はされていません。誰かがこれがどのように行われるかの例を教えてもらえますか? また、上記で説明した 1 対多ではなく、多対多のナビゲーション プロパティを使用してそれを行う方法を教えてください。

そして最後に、私は現在、詳細な JSON 形式である V3 を使用しています。代わりに新しい JSON ライト形式を使用した場合、上記の質問に対する回答は異なりますか? もしそうなら、どのように?

4

3 に答える 3

5

ナビゲーション プロパティをインラインで表す 2 つの方法を見つけました。

application/json;odata=verbose- { "Name": "new name", "Category": { "__metadata": { "uri": "Categories(2)" }}}

application/json-{ "Name": "new name", "Category@odata.bind": "Categories(2)" }

于 2013-10-24T07:51:50.273 に答える
4

Pratik のコメントが答えでした (Pratik がこれを答えとして再投稿したい場合は、そのようにマークします - ありがとう!):

質問: カテゴリ インスタンスを更新しますか、それともカテゴリ インスタンスのいくつかのプロパティを更新しますか。バッチ以外に後で行う方法はありません。前者の場合、{ "Name" : "new name", "Category" : { "__metadata" : { "uri" : "/api.svc/Categories(2)" }}} のようにできます。お役に立てれば。– プラティック

于 2012-12-03T19:47:42.407 に答える
0

もうバッチは必要ありません。1回の呼び出しでそれを行うことができます。変更されたプロパティも送信し、変更されたプロパティをリポジトリに処理させるだけで済みます。

public class Person 
{
   public string FirstName {get;set;}
   public string LastName {get;set;}
   public int Age {get;set;}
}

ファーストネームに Jhon というタイプミスがあり、それが John であるはずであることに気付いたとします。名を編集して送信できます。したがって、次のオブジェクト モデルがあります。これは、次の 2 つの方法のいずれかで取得できます。

  • 2 つのパラメータを持って設定するBodyStyle = WebMessageBodyStyle.Wrapped
  • 2 つのプロパティを持つ汎用モデル オブジェクトを作成するだけです。プロパティ 1 は T 型で、プロパティ 2 はリストです。

したがって、次の json を送信します。

[{ FirstName = 'John' }, ['FirstName']]

サーバー側で、必要なことを実行できるようになりました。

変更されたプロパティを送信したくない場合は、値が既定のプロパティではない任意のプロパティを選択することで、変更されたプロパティを推測できます。

{ FirstName = 'ジョン' }

次に、いくつかの方法を使用して、どのプロパティが変更されたかを確認できます。

  • エンティティごとのカスタム コードで、各プロパティが既定値でないことを確認して設定します。エンティティごとにコードが必要です。
  • 各プロパティがデフォルト値でないことを確認するためのリフレクション。すべてのエンティティに対して 1 つのクラスが必要です。私は2014年にEntity Frameworkでこれを行いました: http://www.rhyous.com/2014/12/01/entityupdater-generic-helper-for-entity-framework/
于 2017-10-02T14:15:22.980 に答える