我有一个带有复杂对象子收集属性的父对象。在执行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客户端代码生成器代理触发。