title: How to POST an entity complete with navigational relationship in Web API OData?
body: <p>I'm using ASP.NET Web API with OData. I'm trying to POST a <strong>Child</strong> entity, which has a relationship to a <strong>Parent</strong> (the parent already exists). When I post the entity (using WCF data service client and SetLink), I can see via Fiddler that it is adding a <code>&lt;link...href=[address of parent]&gt;</code> into the body of the request. This exact same request works against our WCF data service version of the service (we are migrating to Web API). However, this does not seem to translate anything into the Post method on the controller in Web API. </p>
  
  <p><strong>When posting the child to ChildController, how can I access the Parent's ID from the Post action on <em>ChildController</em>?</strong> I know the value is there in the request, but how can I get ahold of this value? The Child cannot be created without a Parent. Do I need to modify the controller action signature? Maybe there is some attribute I can use somewhere? From an API perspective, I would like to avoid adding ParentId directly to the Child entity if possible.</p>
  
  <pre><code>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&lt;Children&gt; Children { get; set; }
  }
  </code></pre>
  
  <p>EDIT:
  Here is my request. I changed some of the names to protect the innocent (replaced host name, and entity names with parent/child):</p>
  
  <pre><code>POST https://localhost/MyWebService/Child HTTP/1.1
  Content-Type: application/atom+xml
  DataServiceVersion: 1.0;NetFx
  MaxDataServiceVersion: 3.0;NetFx
  Accept: application/atom+xml,application/xml
  Accept-Charset: UTF-8
  User-Agent: Microsoft ADO.NET Data Services
  
  Host: localhost
  Content-Length: 1048
  Expect: 100-continue
  
  &lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;entry xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"&gt;
  &lt;category term="MyWebService.Entities.Child" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /&gt;
  &lt;link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Parent" type="application/atom+xml;type=entry" title="Parent" href="https://localhost/MyWebService/Parents(1L)" /&gt;
  &lt;id /&gt;
  &lt;title /&gt;&lt;updated&gt;2014-05-30T16:07:28Z&lt;/updated&gt;&lt;author&gt;&lt;name /&gt;&lt;/author&gt;
  &lt;content type="application/xml"&gt;
  &lt;m:properties&gt;
  &lt;d:Content&gt;content&lt;/d:Content&gt;
  &lt;d:CreatedDate m:type="Edm.DateTime"&gt;0001-01-01T00:00:00&lt;/d:CreatedDate&gt;
  &lt;d:Description&gt;desc&lt;/d:Description&gt;
  &lt;d:Enabled m:type="Edm.Boolean"&gt;true&lt;/d:Enabled&gt;
  &lt;d:Id m:type="Edm.Int64"&gt;0&lt;/d:Id&gt;&lt;d:TabName&gt;tname&lt;/d:TabName&gt;
  &lt;/m:properties&gt;
  &lt;/content&gt;
  &lt;/entry&gt;
  </code></pre>