У меня есть родительский объект со свойством дочерней коллекции сложных объектов. При выполнении процедуры POST для создания новой записи этого родителя и связанных с ним дочерних элементов в действии Post()
я вижу, что родительский десериализован правильно, но дочерняя коллекция пуста.
Проект API использует следующие версии пакетов для веб-API и OData:
Microsoft.AspNet.OData - v7.1.0
Microsoft.AspNet.WebApi - v5.2.7
Примеры моделей:
public class Parent
{
public Parent()
{
Children = new List<Child>();
}
public int Id { get; set; }
public string Name { get; set; }
public List<Child> Children { get; set; }
}
public class Child
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
}
Конфигурация OData
public static void Register(HttpConfiguration config)
{
var builder = new ODataConventionModelBuilder();
builder.Namespace = "NS";
builder.EntitySet<Parent>("Parents")
.EntityType
.Expand(SelectExpandType.Automatic)
.Filter().OrderBy().Select().Page();
config.MapODataServiceRoute("ODataRoute", null, builder.GetEdmModel());
}
Определение контроллера
public class ParentsController : ODataController
{
public async Task<IHttpActionResult> Post(Parent model)
{
// process data from 'model' parameter here
}
}
Внутри этого действия контроллера Post()
коллекция пуста, т. Е. model.Children.Length
равно нулю.
На стороне клиента я использую расширение OData v4 Client Code Generator (v7.5.1) для генерации прокси-классов клиента из метаданных API. В следующем фрагменте показано, как объекты прокси создаются и передаются в конечную точку API:
var apiModel = new Parent();
apiModel.Children.Load(new List<Child> { new Child { Name = "Test Child" } })
Container.AddToParents(apiModel);
await Container.SaveChangesAsync();
Я могу подтвердить, что дочерние объекты передаются в API. Просто кажется, что API не десериализует их в коллекцию для параметра действия. Кто-нибудь знает, что может быть причиной этого? Любая помощь будет принята с благодарностью.
Обновление
Оказывается, что детская коллекция на самом деле не была передана. Трафик, который я перехватил в Fiddler и показал, что дочерний массив запускается каким-то ошибочным тестовым кодом в моем клиенте, а не прокси-сервером OData v4 Client Code Generator.