【问题标题】:POSTing an entity type with children to an (MVC Web Api) OData service将带有子项的实体类型发布到(MVC Web Api)OData 服务
【发布时间】:2013-12-06 11:34:17
【问题描述】:

我一直在寻找以下问题的答案,但到目前为止还没有找到答案。

  1. OData 标准是否支持执行包含实体对象和子实体对象的 POST 请求?
  2. 如果支持,ASP.NET MVC Web Api OData 框架 (EntitySetController) 是否支持开箱即用?

我想到的场景类似于以下内容。您有一个 Parent 对象,其中包含多个 Child 对象。然后你能用这样的身体做一个 POST 吗?

{ "Property1" : "Property value", "Property2" : 100 
     "Children" : [
          { "ChildProperty" : "Some value" },
          { "ChildProperty" : "Some other value" },
          { "ChildProperty" : "Some third value" }
     ]
}

另外,如果我以后想通过发布单个孩子将另一个孩子添加到Parent 对象,是否有标准化的方式将它们链接在一起?像

 { "ChildProperty" : "Fourth child property val", "Parent" : 321 }

“321”是父对象的 ID?

非常感谢您的任何指点!

【问题讨论】:

  • 你能分享 URL 以及你想在哪里发布有效负载吗?
  • 好吧,因为这是一个假设的例子,我没有实际的 URL,但我想它会像 www.mysite.com/odata/parents。 IE。我将在其中发布一个没有子对象的新父对象的相同 URL(这已经很好了)。
  • 当你说复杂对象时,我最初感到困惑。理想情况下,您应该将其称为实体对象,因为只有 OData 中的实体是可直接寻址的。我在下面添加了一个答案。
  • 我明白了。术语的混淆可能解释了为什么我在谷歌上也找不到任何东西。我会更新我的问题,以免混淆未来的读者。

标签: json asp.net-web-api odata


【解决方案1】:

是的,OData 支持这一点,Web API OData 也支持它。 OData 称之为deep insert。这是spec的链接。

现在可以有两种类型的深插入,

1) 嵌套项也是新的,应该被创建。 json 有效负载的示例如下所示,

{
    ‘Property1’: 42,
    ‘Property2’: ‘Contoso’,
    ‘Children’: [
    {
        ‘ChildProperty’: 1,
        ……….
    },
    {
        ‘ChildProperty’: 2,
        ……….
    }]
}

2) 嵌套项已存在,父项是新的,必须链接到嵌套项。 OData 协议调用此绑定。示例有效载荷看起来像,

{
    ‘Property1’: 42,
    ‘Property2’: ‘Contoso’,
    ‘Children@odata.bind’: [
        “http://localhost/Children(1)”,
        “http://localhost/Children(2)”,
    ]
}

Web API OData 支持第一种深度插入,但不支持绑定(第二个示例)。如果是第一个有效负载,您的控制器将收到一个 Parent 对象,其中正确填充了 Children 集合。

关于你的第二个问题,你有两个选择,

1) 将孩子发布到~/Parents(321)/Children URL

2) 将孩子发布到~/Children,然后将此孩子的 ID 链接从该响应发布到 URL ~/Parents(321)/$links/Children

对于 OData 规范的这一部分,您可以参考此 link

【讨论】:

  • 谢谢!关于后一个答案,第 1 部分),我想相关的操作方法将按照惯例命名。在这种情况下,方法会是带有 HttpPost 属性的 'PostChildren(int key, Child entity){...}' 吗?
  • 我在这里找到了我的问题的答案:aspnetwebstack.codeplex.com/discussions/457028。你一直很忙。 ;) 尽管如此,如果不支持通过链接进行绑定,似乎很难完成任何更复杂的事情。关于是否/何时可以在 ASP.NET MVC 中获得此类支持的任何见解?
  • Web API 添加绑定支持了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2012-02-02
  • 2014-07-20
  • 1970-01-01
  • 2013-11-14
相关资源
最近更新 更多