带有NavigationProperty集合的OData V4(webapi)补丁打破了服务器上的deserailization

时间:2015-10-30 17:06:59

标签: asp.net-web-api odata

我试图反对接受Delta的Web API补丁方法。我的实体有一个导航属性,是一个集合。域模型是微不足道的,我有一个团队(实体)和一组成员(导航属性)。

我直接使用HttpClient而不是OData客户端。

我遇到的问题是,当我发送有效负载=团队的补丁请求时,当我在我的有效负载中包含导航属性集合时,我的控制器中反序列化的Delta为空。

例如(忽略缺少的引号,输入}:

{姓名:Foo} - >成功序列化到Delta。 {姓名:Foo,成员:[]} - >无法序列化,Delta无效。

支持吗?我在网上找不到具体的文档,关于你是否可以在补丁上提供导航属性作为整个集合(不是寻找合并支持,只是想要完全替换集合。)

我还尝试调整我的客户端以直接发送Delta有效负载,但默认的JsonMediaTypeFormatter无法将其序列化为有效的请求体(总是生成空的Json),并且ODataMediaTypeFormatter抛出异常,说它无法写入输入Delta,虽然我已经用每个ODataPayloadKind初始化它。

我确定我做错了什么或遗漏了一些基本的东西,假设使用带有HttpClient的Delta +补丁并不具有挑战性。

1 个答案:

答案 0 :(得分:0)

对于OData spec,它说:

11.4.3更新实体

... 实体不得包含相关实体作为内联内容。它可能包含导航属性的绑定信息。对于单值导航属性,这将替换该关系。对于集合值导航属性,这会增加关系。

即您无法将导航属性放在 Patch 请求内容中。

来自Web API OData,它有these codesthese codes。这意味着它不允许修补导航属性表单实体。

但是,您可以按照以下步骤拍摄目标:

  1. 修补主要实体(团队)
  2. 修补依赖实体(成员)
  3. 使用$ ref更新链接
  4. 您可以参考my simple test project