将具有子项的实体类型发布到(MVC Web Api)OData服务

时间:2013-11-21 19:44:39

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

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

  1. OData标准是否支持执行包含具有子实体对象的实体对象的POST请求?
  2. 如果是这样,ASP.NET MVC Web Api OData框架(EntitySetController)是否支持开箱即用?
  3. 我想到的场景如下所示。您有一个Parent对象,其中包含多个Child个对象。你可以用这样的身体做一个POST吗?

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

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

    这样的东西
     { "ChildProperty" : "Fourth child property val", "Parent" : 321 }
    

    其中'321'是父对象的ID?

    非常感谢任何指示!

1 个答案:

答案 0 :(得分:6)

是的,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网址

2)将孩子发布到~/Children,然后将此孩子的ID链接从此回复发布到网址~/Parents(321)/$links/Children

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