【问题标题】:OData POST entity creation with expand使用扩展创建 OData POST 实体
【发布时间】:2013-02-15 17:40:42
【问题描述】:

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

如果我将以下 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"
      }
   ]
}

谢谢, 标记。

【问题讨论】:

    标签: post odata expand


    【解决方案1】:

    查看 OData V3 规范here

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

    在 3.0 版中,响应可能有 204 状态码,如指定 在 [RFC2616] 中,基于客户端的偏好(参见 Prefer (section 2.2.5.9)) 在 InsertEntity 请求上。

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

    $expand 对 POST(或任何 CUD 请求)没有影响,我并不感到惊讶。如果不是查询,WCF DS 可能会忽略它。根据规范,这可能是正确的。

    坦率地说,我认为使用 WCF DS Server 将无法取回其他任何东西。在 V3 中,您可以(仅)获得带有实体的 201,或者如果您指定标头表示您不想要内容,则获得 204 无内容。

    这是否符合 OData... 不完全确定 :-)。无论如何,我认为您目前无法在 WCF DS 堆栈上获得您想要的东西。

    【讨论】:

      【解决方案2】:

      我能够在 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 URL 查询字符串应包含?$expand=user_objects_attributes

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-28
        • 1970-01-01
        相关资源
        最近更新 更多