如何将派生实体发布到基本实体集

时间:2015-12-14 23:57:08

标签: odata

假设我有一个名为Employee的基本实体类型和一个名为Manager的派生实体类型。并且可以通过/Employees URL访问所有员工的集合。将Manager实例发布到Employees实体集的正确方法是什么?

OData v4 protocol spec说“要在集合中创建实体,客户端会向该集合的URL发送POST请求。”但是规范没有说明在存在派生类型的情况下指定POSTed实体的类型。

URI spec表示派生类型应使用目标网址上的强制转换段进行处理。例如,

POST /Employees/NS.Manager
{ "Name": "Bill Lumbergh" ... }

同时,JSON Format spec建议使用odata.type注释,如下所示:

POST /Employees
{ "@odata.type": "#NS.Manager", "Name": "Bill Lumbergh" ... }

哪个是正确的?或两者都是?

请记住,我询问的是OData规范,而不是特定的OData库/框架(例如ASP.NET)。

2 个答案:

答案 0 :(得分:3)

好问题!

从OData协议的角度来看,如果要在从目标类型派生的JSON请求中指定实例,则应包含@ odata.type注释。您不需要在POST上指定强制转换段(尽管某些实现可能支持,有些可能不支持)。

所以我希望你的第二个例子是最具互操作性的。

谢谢,

迈克皮佐 联合编辑,OASIS OData规范

答案 1 :(得分:1)

在我的选项中,两者都是正确的,但是有一些区别。

对于#1,

POST /Employees/NS.Manager
{ "Name": "Bill Lumbergh" ... }

您将获得Manager个实例。因此,您可以直接访问定义到Manager的属性。

对于#2,

POST /Employees
{ "@odata.type": "#NS.Manager", "Name": "Bill Lumbergh" ... }

您将获得Employee个实例。因此,您应该将实例强制转换为Manager,然后访问Manager属性。

从Web API OData实现方面:

对于#1,它将在EmployeesController

中调用以下方法
public IHttpActionResult PostFromManager(Manager manager)
{ ... }

而对于#2,它将在EmployeesController

中调用以下方法
public IHttpActionResult Post(Employee employee)
 { ... }