我正在尝试同时创建实体和两个子实体的实例。
如果我将以下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"
}
]
}
谢谢, 标记
答案 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
。