9

どうした?

ASP.net Web API アプリでパッチ適用を有効にしようとしています。コードファーストエンティティフレームワークを使用しています。

ブレークポイントを設定できる次のメソッド ヘッダーがあり、ヒットします。

[AcceptVerbs("PATCH")]
public async Task<HttpResponseMessage> Patch(long appId, long id, Delta<SimpleFormGroup> formGroup)

ただし、formGroup.Patch(entity) を呼び出しても、エンティティは変更されません。次をイミディエイトウィンドウに入れると:

formGroup.GetChangedPropertyNames()

次に、このコレクションは空です。これは間違っているようです。

私は何を試しましたか?

私は次の例を参照してきました

http://techbrij.com/http-patch-request-asp-net-webapi http://www.strathweb.com/2013/01/easy-asp-net-web-api-resource-updates-with-delta /

Json MediaType Formatter が Delta オブジェクトを正しく構築する方法を認識していないことが問題のようですが、2 番目のリンクでは、filip は oDataMediaTypeFormatter がなくても機能することを示唆しているようです。

私は自分のモデルを EDMX 表現にシリアライズしようと試み始め、そこから CSDL を抽出して oDataMediaTypeFormatter を作成できるようにしましたが、そこにも問題があり、少しやり過ぎのようです。

誰かがこれに光を当てることができれば、それは大歓迎です。さらに情報が必要な場合はお知らせください。

編集:

SimpleFormGroup のクラス定義は次のとおりです。

public class SimpleFormGroup
{
    public int LastUpdate;

    public string Identifier;

    public string Title;

    public int DisplayOrder;
}

そして、ここに私が送信しているデータがあります:

Content-Type: 'application/json'

{ "DisplayOrder" : "20 }
4

2 に答える 2

9

興味深いことに、Delta<T>int メンバーでは JSON では機能しないようです。

残念ながら、Delta<T>OData 専用に作成されました。Delta<T>OData 以外のフォーマッタで動作しているように見える場合は、意図的ではなく偶然です。

ただし、良いニュースは、JSON 用に独自の PATCH 形式を定義することを妨げるものは何もないということです。Json.NET でより適切に機能するものをまだ誰も作成していないとしたら、私は驚くでしょう。Web API の将来のリリースでパッチ適用を再検討し、フォーマッター間で機能する一貫したストーリーを考え出す可能性があります。

于 2013-02-06T16:42:42.233 に答える
4

うまくいかない理由を調査し、発見してくれた Youssef に感謝します。うまくいけば、それはうまく解決できるでしょう。

oData パッケージ ソースを詳しく調べた後、最終的に自分でこれをクラックすることができました。HttpContent への簡単なアクセスを提供するため、ロジックをラップする別の MediaTypeFormatter を実装することにしましたが、これを実現する方法は他にもあります。

重要な部分は、コードの最初のモデルを解釈する方法を理解することでした。以下のコメント行を参照してください。

public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
{
    var builder = new ODataConventionModelBuilder();

    // This line will allow you to interpret all the metadata from your code first model
    builder.EntitySet<EfContext>("EfContext");

    var model = builder.GetEdmModel();
    var odataFormatters = ODataMediaTypeFormatters.Create(model);
    var delta = content.ReadAsAsync(type, odataFormatters).Result; 

    var tcs = new TaskCompletionSource<object>(); 
    tcs.SetResult(delta); 
    return tcs.Task; 
}

これが誰かのトラブルを救うことを願っています!

于 2013-02-08T09:12:26.953 に答える