发布到 OData v4 Web API 操作时子集合为空

Child collection empty when POSTing to OData v4 Web API action

我有一个父对象和一个复杂对象的子集合 属性。当执行 POST 以创建此父项及其相关子项的新记录时,我可以在 Post() 操作中看到父项已正确反序列化,但子项集合为空。

API 项目对 Web 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 客户端代码生成器 (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 客户端代码生成器代理。

问题是 OData v4 客户端代码生成器生成的代理不支持深度插入。 whosebug.com question gave me the correct terminology to search for, as it was answered in 2017 & I was looking to see if support has been added. Sadly it doesn't appear so, judging by this 团队 GitHub 上的未解决问题。

目前,唯一的选择似乎是创建父项,然后创建所有子项,作为两个单独的调用,或者切换到不同的库,如 RestSharp。