我正在尝试使用 WCF 数据服务提供的 OData 服务(目前使用 OData V3 application/json;odata=verbose 有效负载格式。我将来可能会使用 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; }
}
现在,我想为 Person 创建一个简单的编辑页面。这个编辑页面可能有一个名称输入,以及一个人的类别的输入或下拉列表。
所以,场景是这样的:
- 代码使用 $expand 为 Category 下载 Person: GET /api.svc/People(1)?$expand=Category
- 用户编辑人员的名称属性及其类别。
- 该页面的代码发出一个更新该人员的名称和类别属性的请求。
这里的关键在于“单个请求”。这是我找不到文档的部分。我见过他们将上面的数字 3 分成两个请求的例子。像这样的东西(我不记得确切的格式 - 我也不确定您是否必须在执行 PUT 之前删除类别链接):
PATCH /api.svc/People(1) with content: {"Name": "new name" }
PUT /api.svc/People(1)/$links/Category with content: { "url": "/api.svc/Categories(2)" }
但是,我也听说过,但没有证明,可以通过对 Category 导航属性的更改与对 Person 实体的其他更改一起指定的单个请求来实现此更新。有人可以给我一个如何做到这一点的例子吗?另外,你能告诉我如何使用多对多导航属性来完成,而不是我上面描述的一对多。
最后,我目前使用的是详细的 JSON 格式 V3。如果我改用新的 JSON 灯光格式,您对上述问题的回答会不会有所不同?如果是这样,怎么做?