如何使用Microsoft ASP.NET Web API OData中的Delta <T>和Code First\JsonMediaTypeFormatter

bey*_*ode 9 c# rest odata asp.net-web-api

有什么问题?

我正在尝试在我的ASP.net web api应用程序中启用修补程序.我正在使用代码第一实体框架.

我有以下方法标题,我可以设置一个断点,它将命中:

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

但是,当我调用formGroup.Patch(实体)时,不会对我的实体进行任何更改.如果我将以下内容放入即时窗口:

formGroup.GetChangedPropertyNames()
Run Code Online (Sandbox Code Playgroud)

然后这个集合是空的,这似乎是错误的.

我试过了什么?

我一直在提到以下例子

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对象,但是在第二个链接中,filip似乎表明它应该在没有oDataMediaTypeFormatter的情况下工作.

我已经开始试图将我的模型序列化为EDMX表示,然后从那里提取CSDL以便我可以创建一个oDataMediaTypeFormatter,但我也遇到了障碍,加上它似乎有点矫枉过正.

如果有人能够对此有所了解,那将非常感激.如果需要更多信息,请与我们联系.

编辑:

这是SimpleFormGroup的类定义:

public class SimpleFormGroup
{
    public int LastUpdate;

    public string Identifier;

    public string Title;

    public int DisplayOrder;
}
Run Code Online (Sandbox Code Playgroud)

这是我发送的数据:

Content-Type: 'application/json'

{ "DisplayOrder" : "20 }
Run Code Online (Sandbox Code Playgroud)

谢谢,皮特

You*_*oui 9

有趣的是,看起来像Delta<T>int成员不适用于JSON.

不幸的是,Delta<T>专门为OData创建.如果Delta<T>看起来与除OData之外的任何格式化程序一起使用,那就是巧合,而不是故意的.

好消息是,没有什么可以阻止你为JSON定义自己的PATCH格式,如果没有人编写一个更适合Json.NET的版本,我会感到惊讶.我们可能会在未来的Web API版本中重新进行修补,并尝试提供一个适用于格式化程序的一致故事.

  • 具有可支持的Delta <T>不仅可以从OData使用,而且通常可以从Web API使用,这将是非常有益的.每次我创建一个依赖于提交者的离散知识来执行部分更新的Patch()动作时,它让我感到很难过:(在Codeplex上是否有问题我们可以投票以帮助合法化需求? (3认同)
  • 这是一个很好的起点:http://aspnetwebstack.codeplex.com/workitem/777. (3认同)
  • 我注意到它在*int*和*Guid*上为JSON扼流圈.我在这里发布了一个解决方法http://www.strathweb.com/2013/01/easy-asp-net-web-api-resource-updates-with-delta/.简而言之,JSON.NET将int视为long,将Guid视为字符串,因此Delta <T>代码需要屏蔽它, (3认同)
  • 我希望他们能在https://aspnetwebstack.codeplex.com/workitem/777上停止玩笑.这对mvc/web api来说非常有用. (2认同)