2013-02-15 9 views
6

エンティティと2つの子エンティティのインスタンスを同時に作成しようとしています。拡張によるOData POSTエンティティの作成

私は次のJSONを/ user_objectsリソースに投稿すると、うまく親のuser_objectエンティティとリンクされたUser_object_attributeエンティティを作成します。唯一の問題は、新しいuser_object_attributeを含むように結果セットを拡張しているように見えないため、user_objectの事実上のバージョンを効果的に使用できますが、ODataサービスuser_object_attributesを取得します。

返されたとき、私は、子のuser_object_attributeオブジェクトにきれいに入るIDを持っていますが、子がcreated_dateのようなサーバー側の生成フィールドを持っていたらどうなりますか?それでは、私はまだODataレポをもう一度打つ必要がありますか?

正しい$拡張クエリを試しましたか?$ expand = user_objects_attributes作成が成功しても、まだ展開された結果セットは返されません。

これが可能かどうかは誰にも分かりますか?それとも、それはすべての子のuser_object_attributesを返すことだけでしょうか?

{ 
    "annotator_id":1, 
    "content_type":"content_type", 
    "created_date":"2013-02-15T17:20:09.191", 
    "guid":"GUID", 
    "size_kb":100, 
    "title":"Title", 
    "updated_date":null, 
    "url":"URL", 
    "user_object_id":0, 
    "user_objects_attributes":[ 
     { 
     "attribute_id":0, 
     "name":"name191", 
     "user_object_id":0, 
     "value":"value191" 
     } 
    ] 
} 

ありがとう、 マーク。

答えて

3

のOData V3仕様hereを見て:インサートは完全に成功した場合、バージョン1.0およびバージョン2.0で

、 サーバ201(作成された)状態コードと で応答を返さなければなりませんがInsertEntity 要求(セクション2.2.7.1.1)で指定された構文に準拠する応答本体。サーバーがすべてのサーバー固有のデータ処理規則(検証など)を実行した後、応答本体には挿入されたリソースの値 が入っていなければならない(MUST)。 サーバは、リソースがサーバに挿入される前に、クライアント から受信したリソースの値を変更してもよい(MAY)。

バージョン3.0では、応答はInsertEntity要求のクライアントの好み(Prefer(セクション 2.2.5.9)を参照)に基づいて、[RFC2616]で指定された の204ステータスコードを持つかもしれません。

サーバーが何をすべきかわからない...トップレベルで作成されたエンティティ、またはそのエンティティとそのすべてが展開されたリンクだけを返します。

$ expandがPOST(またはCUDリクエスト)に何の影響も及ぼさないということは驚くことではありません。 WCF DSはクエリでない場合、おそらく無視します。そしてスペックによって、これはおそらく正しいでしょう。

まあまあ、私はWCF DS Serverではもう何も戻ってこないと思います。 V3では、エンティティ(唯一)と一緒に201を取得するか、コンテンツを必要としないというヘッダを指定すると204のコンテンツを取得しません。

これはODataに準拠しているかどうかは完全にはわかりません:-)。それにもかかわらず、私はこの時点であなたがWCF DSスタックに必要なものを手に入れることはできないと思います。

0

POSTの後にナビゲーションプロパティを返して、OData v4の$expandクエリオプションを使用して問題なしで新しいエンティティを作成することができました。

メソッドが[EnableQuery]で装飾されており、Includeにナビゲーションプロパティの名前が付けられていることを確認してください。例えば

[EnableQuery] 
public IHttpActionResult Post(user_object user) 
{ 
    if (!this.ModelState.IsValid) 
    { 
     return this.BadRequest(this.ModelState); 
    } 

    this.db.user_objects.Add(user); 
    this.db.SaveChanges(); 

    user = this.db.user_objects.Include("user_objects_attributes").Single(x => x.user_object_id == user.user_object_id)); 

    return this.Created(user); 
} 

POST URLのクエリ文字列が?$expand=user_objects_attributesを含める必要があります。

も参照してください:
https://github.com/OData/WebApi/issues/356

関連する問題