Дочерняя коллекция пуста, когда POSTing к действию OData v4 Web API - PullRequest
0 голосов
/ 21 июня 2019

У меня есть родительский объект со свойством дочерней коллекции сложных объектов. При выполнении процедуры 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.

1 Ответ

0 голосов
/ 21 июня 2019

Проблема в том, что прокси-сервер, сгенерированный OData v4 Client Code Generator, не поддерживает глубокие вставки. Этот вопрос Stackoverflow.com дал мне правильную терминологию для поиска, так как на него был дан ответ в 2017 году, и я искал, была ли добавлена ​​поддержка. К сожалению, это не так, судя по этому открытому вопросу на GitHub команды.

На данный момент единственными вариантами, по-видимому, являются создание родительского элемента, а затем всех дочерних элементов в виде двух отдельных вызовов или переключение на другую библиотеку, например RestSharp.

...