Как разместить объект с навигационными связями в OData Web API?
Я использую ASP.NET Web API с OData. Я пытаюсь POST дочерний объект, который имеет отношение к родителю (родитель уже существует). Когда я публикую сущность (используя клиент службы данных WCF и SetLink), я вижу через Fiddler, что она добавляет <link...href=[address of parent]>
в тело запроса. Этот точно такой же запрос работает с нашей версией службы данных WCF (мы переходим на Web API). Однако, похоже, это ничего не переводит в метод Post на контроллере в Web API.
Когда я отправляю ребенка в ChildController, как я могу получить доступ к идентификатору родителя из действия Post в ChildController? Я знаю, что значение есть в запросе, но как я могу получить это значение? Ребенок не может быть создан без Родителя. Нужно ли изменять сигнатуру действия контроллера? Может быть, есть какой-то атрибут, который я могу использовать где-нибудь? С точки зрения API, я хотел бы избежать добавления ParentId непосредственно к объекту Child, если это возможно.
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; }
}
РЕДАКТИРОВАТЬ: Вот моя просьба. Я изменил некоторые имена, чтобы защитить невинных (заменил имя хоста и имена сущностей на parent/child):
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
<?xml version="1.0" encoding="utf-8"?>
<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">
<category term="MyWebService.Entities.Child" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<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)" />
<id />
<title /><updated>2014-05-30T16:07:28Z</updated><author><name /></author>
<content type="application/xml">
<m:properties>
<d:Content>content</d:Content>
<d:CreatedDate m:type="Edm.DateTime">0001-01-01T00:00:00</d:CreatedDate>
<d:Description>desc</d:Description>
<d:Enabled m:type="Edm.Boolean">true</d:Enabled>
<d:Id m:type="Edm.Int64">0</d:Id><d:TabName>tname</d:TabName>
</m:properties>
</content>
</entry>
1 ответ
Чтобы опубликовать сущность по навигационной ссылке, вам нужно определить свое действие в Родительском контроллере. Вот фрагмент кода:
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();
}
}