0

MVC 4 WebApi を使用して、いくつかのエンティティを Azure Table Storage に投稿しています。これらは複雑な型 (私が作成したクラス) であり、URI ではなく本体で API に送信されているため、モデル バインドではなく書式設定を使用していると思います。

これは、他のエンティティを指す 1 つ (Comment と呼ばれるクラス) を除いて、すべてのエンティティでうまく機能しています (他のエンティティのプロパティを持っています)。本文で API に渡す JSON には、他のエンティティを含む 2 つのプロパティがあります。

Azure Table Storage の場合、各エンティティには RowKey 属性があります。コントローラーがリクエスト本文の JSON からエンティティを作成すると (MVC4 フォーマットを使用)、RowKey の値が間違っていることに気付きました。実際には、2 つのプロパティで参照されているエンティティのいずれかの値を持っています。私は言及した。この他のエンティティの RowKey 属性も JSON に含まれているため、JSON には 3 つの RowKeys がありますが、正しいエンティティの一部になるようにすべて JSON に適切に配置されています。フォーマッターはそれを間違って読んでいるようです。

このコメントを保存できません。Table Storage サービスは気にしない (検証がない) ため、主な問題が理由ではないと思いますが、これは Azure Table Storage サービスでエンティティを保存できなくする問題の一部に過ぎないと思います。このような MVC フォーマットで同様の問題が発生した人はいますか?

ありがとう!

編集 言及するのを忘れていました-テストのために、フォーマッターが壊れている同じコントローラーメソッド内で新しいコメントエンティティをインスタンス化すると、問題なく保存されます。したがって、コントローラの Post メソッドに渡されるエンティティの WebApi の解析で問題が発生していることは確かです。

JSON とモデルの追加:

{
  "PartitionKey": "US",
  "RowKey": "com-dd1920ed-2e87-4f51-a6d1-32fa692aadae",
  "AboutKey": "US|per-fb1de571-7142-47c8-bdb3-0eddd59f6ccd",
  "FromPersonKey": "US|per-4c3261d8-3b1a-4bd4-8850-4d769cfbd7ef",
  "CommentText": "Testing Create.",
  "FromPerson": {
    "PartitionKey": "US",
    "RowKey": "per-4c3261d8-3b1a-4bd4-8850-4d769cfbd7ef",
    "FirstName": "John",
    "LastName": "Smith",
    "NickName": null,
    "FullName": "John Smith",
    "Description": null,
    "ImageLocation": null,
    "Region": "US"
  },
  "About": {
    "PartitionKey": "US",
    "RowKey": "per-fb1de571-7142-47c8-bdb3-0eddd59f6ccd",
    "FirstName": "George",
    "LastName": "Martin",
    "NickName": "Cowboy Hat",
    "FullName": "George Martin",
    "Description": "Ten gallons big.",
    "ImageLocation": null,
    "Region": "US"
  },
  "CommentDateTime": "2012-08-25T13:41:09.8899185Z"
}

モデル (デバッグ ローカル ウィンドウから投稿された、JSON からの不適切なバインド)。ここで気付くもう 1 つの問題は、"About" プロパティが null であることです。これは Person オブジェクトである必要がありますが、おそらくクラスではなくインターフェイスのタイプであるため、Json.Net はこのプロパティを解析していないようです。明らかにここでは、JSON でそのプロパティに渡されるのは人ですが、それは別のものである可能性があるため、そこでインターフェイスを使用します。

comment         {Classes.Comment}                           Classes.Comment  
About           null                                        Classes.ICommentable  
AboutKey        US|per-fb1de571-7142-47c8-bdb3-0eddd59f6ccd string  
CommentDateTime {1/1/0001 12:00:00 AM}                      System.DateTime  
CommentText     Testing Create.                             string  
FromPerson      {Classes.Person}                            Classes.Person  
FromPersonKey   US|per-4c3261d8-3b1a-4bd4-8850-4d769cfbd7ef string  
PartitionKey    US                                          string  
RowKey          per-fb1de571-7142-47c8-bdb3-0eddd59f6ccd    string  
4

0 に答える 0