8

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

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

谢谢,马克。

4

2 回答 2

4

在这里查看OData V3 规范:

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

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

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

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

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

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

于 2013-02-22T03:26:11.947 回答
1

我能够在使用 OData v4 的查询选项POST创建新实体之后返回导航属性,而不会出现问题。$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);
}

POSTURL 查询字符串应?$expand=user_objects_attributes包括.

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

于 2017-09-01T03:41:50.430 回答