POST到OData v4 Web API操作时,子集合为空

时间:2019-06-21 15:32:45

标签: c# asp.net-web-api2 odata odata-v4

我有一个带有复杂对象子收集属性的父对象。在执行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并未将这些反序列化为action参数的集合。任何人都知道可能导致这种情况发生的原因吗?任何帮助将不胜感激。

更新
事实证明子集合实际上并没有通过。我在Fiddler中捕获的流量显示子阵列正在被客户端中某些错误的测试代码触发,而不是由OData v4客户端代码生成器代理触发。

1 个答案:

答案 0 :(得分:0)

问题是由OData v4客户端代码生成器生成的代理不支持深度插入。 This Stackoverflow.com的问题为我提供了正确的搜索术语,因为该术语在2017年得到了解答,我一直在寻找是否已添加支持。遗憾的是,根据this在团队GitHub上的未解决问题来看,它似乎并非如此。

目前,唯一的选择似乎是创建父级,然后将所有子级创建为两个单独的调用,或切换到像RestSharp这样的不同库。