Asp.net web api 如何在Web API OData中发布具有导航关系的实体?

Asp.net web api 如何在Web API OData中发布具有导航关系的实体?,asp.net-web-api,odata,wcf-data-services,asp.net-web-api-routing,wcf-data-services-client,Asp.net Web Api,Odata,Wcf Data Services,Asp.net Web Api Routing,Wcf Data Services Client,我正在将ASP.NET Web API与OData一起使用。我试图发布一个子实体,它与父实体有关系(父实体已经存在)。当我发布实体(使用WCF数据服务客户端和SetLink)时,我可以通过Fiddler看到它正在向请求主体中添加一个。这个完全相同的请求适用于我们的WCF数据服务版本的服务(我们正在迁移到WebAPI)。但是,这似乎并没有将任何内容转换为Web API中控制器上的Post方法 将子项发布到ChildController时,如何通过对ChildController的Post操作访问父

我正在将ASP.NET Web API与OData一起使用。我试图发布一个子实体,它与父实体有关系(父实体已经存在)。当我发布实体(使用WCF数据服务客户端和SetLink)时,我可以通过Fiddler看到它正在向请求主体中添加一个
。这个完全相同的请求适用于我们的WCF数据服务版本的服务(我们正在迁移到WebAPI)。但是,这似乎并没有将任何内容转换为Web API中控制器上的Post方法

将子项发布到ChildController时,如何通过对ChildController的Post操作访问父项ID?我知道请求中有该值,但如何获取该值?如果没有父级,则无法创建子级。我是否需要修改控制器操作签名?也许我可以在某个地方使用某些属性?从API的角度来看,如果可能的话,我希望避免将ParentId直接添加到子实体中

public class ChildController
{
    public HttpActionResult Post([FromBody]Child child)
    {
        //child.Parent is null here, but all other 
        //properties of Child are populated.
        //How can I get the Parent's ID from the POST request??
    }
}

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Parent Parent { get; set; }
}

public class Parent
{
    public int Id { get; set; }
    public IEnumerable<Children> Children { get; set; }
}
公共类ChildController
{
公共HttpActionResult帖子([FromBody]子项)
{
//此处的child.Parent为null,但所有其他
//将填充子对象的属性。
//如何从POST请求中获取家长ID??
}
}
公营儿童
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共父级{get;set;}
}
公共类父类
{
公共int Id{get;set;}
公共IEnumerable子项{get;set;}
}
编辑: 这是我的要求。我更改了一些名称以保护无辜者(将主机名和实体名替换为父/子):

POSThttps://localhost/MyWebService/Child HTTP/1.1
内容类型:应用程序/atom+xml
DataServiceVersion:1.0;NetFx
MaxDataServiceVersion:3.0;NetFx
接受:application/atom+xml,application/xml
接受字符集:UTF-8
用户代理:Microsoft ADO.NET数据服务
主机:本地主机
内容长度:1048
预期:100人继续
2014-05-30T16:07:28Z
内容
0001-01-01T00:00:00
描述
真的
0tname

为了从导航链接发布实体,您需要在父控制器中定义您的操作。以下是代码片段:

public class ParentController
{
    public HttpActionResult PostToChildren(int key, [FromBody]Child child)
    {
        var parent = parents.single(p=>p.Id == key);
        if(parent != null)
        {
            parent.Children.Add(child);
            ChildController.Children.Add(child);
            return StatusCode(HttpStatusCode.NoContent);
        }
        else
            return BadRequest();
    }
}

谢谢我的主要问题是:我如何通过直接向ChildController发送帖子来实现这一点?这是一个重构,所以我试图维护现有的web服务行为。嗨,Josh,你能分享你的请求url和正文吗?如果您不想发布到ParentController,为什么会有导航链接?或者child.Parent.Id是你想要的吗?嗨@Feng,我更新了上面的请求。我不介意将post-to-Parent作为一个额外的切入点,但是如果能够保持现有的能力,将post-to-Child作为一个顶级实体,那就太好了。在我们的API中,这发生在几个不同的地方,避免API使用者的重构将是一件好事,我想一般来说,拥有这种能力将是一件好事。在回答您的另一个问题时,是的,child.Parent.Id肯定是我想要得到的,这样我就可以创建实体并将其绑定到适当的父级。提前感谢您的任何想法!
public class ParentController
{
    public HttpActionResult PostToChildren(int key, [FromBody]Child child)
    {
        var parent = parents.single(p=>p.Id == key);
        if(parent != null)
        {
            parent.Children.Add(child);
            ChildController.Children.Add(child);
            return StatusCode(HttpStatusCode.NoContent);
        }
        else
            return BadRequest();
    }
}