OData POST实体创建与扩展

时间:2013-02-15 17:40:43

标签: post odata expand

我正在尝试同时创建实体和两个子实体的实例。

如果我将以下JSON发布到/ user_objects资源,则可以愉快地创建父user_object实体和链接的User_object_attribute实体。唯一的问题是我似乎无法扩展结果集以包含新的user_object_attribute所以我有效地拥有user_object的最新版本但我必须从OData服务读取,即另一个服务器命中以便检索user_object_attributes。

返回后,我的id会整齐地进入子user_object_attribute对象,但是如果孩子有另一个服务器端生成的字段如created_date会怎么样?然后我还要再次点击OData回购?

我尝试过正确的$ expand查询?$ expand = user_objects_attributes,当创建成功时,我仍然没有返回扩展的结果集。

如果有可能,有人会有任何想法吗?或者是因为它不是因为只有这样才能返回所有子user_object_attributes?

{
   "annotator_id":1,
   "content_type":"content_type",
   "created_date":"2013-02-15T17:20:09.191",
   "guid":"GUID",
   "size_kb":100,
   "title":"Title",
   "updated_date":null,
   "url":"URL",
   "user_object_id":0,
   "user_objects_attributes":[
      {
         "attribute_id":0,
         "name":"name191",
         "user_object_id":0,
         "value":"value191"
      }
   ]
}

谢谢, 标记

2 个答案:

答案 0 :(得分:3)

查看OData V3规范here

  

在版本1.0和版本2.0中,如果插入成功,则   服务器必须返回一个带有201(已创建)状态代码和a的响应   响应主体,符合InsertEntity中指定的语法   要求(第2.2.7.1.1节)。响应主体必须包含值   服务器执行完所有后插入的资源   特定于服务器的数据处理规则(验证等)。该   服务器可以改变从客户端接收的资源的值   在资源插入服务器之前。

     

在3.0版中,响应可以具有204状态代码,如指定的那样   在[RFC2616]中,基于客户端首选项(请参阅首选项(部分   2.2.5.9))关于InsertEntity请求。

不太清楚服务器应该做什么...只返回顶级创建的实体,或者该实体及其所有扩展链接。

我毫不奇怪$扩展对POST(或任何CUD请求)没有影响。如果它不是查询,WCF DS可能会忽略它。根据规范,这可能是正确的。

坦率地说,我认为使用WCF DS Server你无法得到任何其他东西。在V3中,如果您指定标题表示您不想要任何内容​​,那么您的实体(仅限)将获得201,或者获得204无内容。

是否符合OData ......不完全确定:-)。无论如何,我认为你现在不能在WCF DS堆栈上得到你想要的东西。

答案 1 :(得分:0)

我能够在POST之后返回导航属性,以便使用OData v4的$expand查询选项创建新实体,而不会出现问题。

确保您的方法使用[EnableQuery]进行修饰,然后使用导航属性的名称调用Include

例如:

[EnableQuery]
public IHttpActionResult Post(user_object user)
{
    if (!this.ModelState.IsValid)
    {
        return this.BadRequest(this.ModelState);
    }

    this.db.user_objects.Add(user);
    this.db.SaveChanges();

    user = this.db.user_objects.Include("user_objects_attributes").Single(x => x.user_object_id == user.user_object_id));

    return this.Created(user);
}

POST网址查询字符串应包含?$expand=user_objects_attributes

另见:
https://github.com/OData/WebApi/issues/356