如何在一个请求中更新OData实体并修改其导航属性?

Jer*_*ell 7 json wcf-data-services odata

我正在尝试使用WCF数据服务提供的OData服务来实现我认为的简单场景(使用OData V3应用程序/ json; odata =详细的有效载荷格式,现在.我将来可能会使用JSON Light格式) .基本情况如下:

我有两个实体:

class Person 
{ 
  public int ID { get; set; }
  public string Name { get; set; } 
  public virtual PersonCategory Category { get; set; }
}

class PersonCategory
{
  public int ID { get; set; }
  public string Description { get; set; }
  public virtual ICollection<Person> People { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想为Person创建一个简单的编辑页面.此编辑页面可能具有Name的输入,以及Person类别的输入或下拉列表.

所以,场景如下:

  1. 代码使用$ expand下载人员类别:GET /api.svc/People(1)?$expand=Category
  2. 用户编辑人员的姓名属性及其类别.
  3. 页面代码只发出一个请求来更新Person的Name和Category属性.

这里的关键是"单一请求".这是我找不到文档的部分.我见过他们将上面的数字3分成两个请求的例子.这样的事情(我不记得确切的格式 - 我也不确定你在做PUT之前是否必须删除Category链接):

PATCH /api.svc/People(1) with content: {"Name": "new name" }
PUT /api.svc/People(1)/$links/Category with content: { "url": "/api.svc/Categories(2)" }
Run Code Online (Sandbox Code Playgroud)

但是,我也听说过,但没有证明,可以将此更新实现为单个请求,并更改为与Person实体的其他更改内联指定的Category导航属性.有人能给我一个如何做到这一点的例子吗?另外,您能告诉我如何使用多对多导航属性,而不是我上面描述的一对多导航属性.

最后,我目前正在使用详细的JSON格式V3.如果我改为使用新的JSON光格式,您对上述问题的回答是否会有所不同?如果是这样,怎么样?

Han*_*rbe 5

我发现了两种内联表示导航属性的方法:

application/json;odata=verbose -- { "Name": "new name", "Category": { "__metadata": { "uri": "Categories(2)" }}}

application/json -- { "Name": "new name", "Category@odata.bind": "Categories(2)" }

  • 您的第一个示例是 OData 3.0 规范。你的第二个是 OData 4.0 (2认同)

Jer*_*ell 4

Pratik 的评论就是答案(Pratik 如果您想将其重新发布为答案,我会将其标记为这样 - 谢谢!):

\n\n
\n

问题:您想要更新类别实例还是想要更新类别实例的某些属性。除了批处理之外,没有其他办法可以做到后者。对于前者,您可以执行以下操作:{ "Name" : "new name", "Category" : { "__metadata" : { "uri" : "/api.svc/Categories(2)" }}}。希望这可以帮助。\xe2\x80\x93 普拉蒂克

\n
\n