0

我正在使用 MVC 4 WebApi 将多个实体发布到 Azure 表存储。我相信它使用的是格式化而不是模型绑定,因为这些是复杂类型(我编写的类)并且它们被发送到正文中的 API,而不是 URI。

这适用于所有实体,除了一个实体(称为 Comment 的类),它指向其他实体(它具有其他实体的属性)。我在正文中传递给 API 的 JSON 有 2 个包含其他实体的属性。

对于 Azure 表存储,每个实体都有一个 RowKey 属性。我注意到,一旦我的控制器从请求正文中的 JSON 构建实体(使用 MVC4 格式),它的 RowKey 值就错误了 - 它实际上具有在 2 个属性中引用的实体之一的值我提到。这个其他实体的 RowKey 属性也包含在 JSON 中 - 因此 JSON 有 3 个 RowKey,但它们都正确地位于 JSON 中,成为正确实体的一部分。格式化程序似乎读错了。

我无法保存此评论。我不认为关键问题是原因,因为表存储服务不应该关心(没有验证),但我相信这只是导致 Azure 表存储服务无法保存实体的问题的一部分。有没有人对像这样的 MVC 格式有类似的问题?

谢谢!

编辑 我忘了提到 - 为了测试,如果我在格式化程序正在破坏的同一个控制器方法中实例化一个新的 Comment 实体,它保存得很好。所以我相当确定问题出在 WebApi 对传递给控制器​​ Post 方法的实体的解析中。

添加 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 绑定错误,从调试本地窗口发布)。您会在这里注意到的另一个问题是“关于”属性为空。这应该是一个 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