C# Web Api参数绑定不一致

C# Web Api参数绑定不一致,c#,asp.net-web-api,asp.net-web-api2,C#,Asp.net Web Api,Asp.net Web Api2,在谷歌搜索了几个小时并试图弄明白这一点后,我仍然无法弄明白这一点。问题是create方法的“[FromBody]Route input”参数出于某种原因将Route.RouteMember[0].Lab绑定到提供的数据,但它将Route.RouteMember[0].RouteMemberType设置为null。(RouteMember数组中的所有项都会发生这种情况,而不仅仅是第一项)为什么RouteMemberType没有绑定到输入,而是绑定到lab的输入?我必须承认,我有时看到它绑定到Rou

在谷歌搜索了几个小时并试图弄明白这一点后,我仍然无法弄明白这一点。问题是create方法的“[FromBody]Route input”参数出于某种原因将Route.RouteMember[0].Lab绑定到提供的数据,但它将Route.RouteMember[0].RouteMemberType设置为null。(RouteMember数组中的所有项都会发生这种情况,而不仅仅是第一项)为什么RouteMemberType没有绑定到输入,而是绑定到lab的输入?我必须承认,我有时看到它绑定到RouteMemberType,但没有明显的原因

相关WebApiConfig

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
json.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
路由控制器

[HttpPost]
public Route Create([FromBody] Route input) {
    UnitOfWork.Routes.Add(input);
    UnitOfWork.SaveChanges();
    return input;
}
public class RouteMember : BaseModel {
    [ForeignKey("Route")]
    public int RouteId { get; set; }

    public virtual Route Route { get; set; }

    [ForeignKey("Lab")]
    public int LabId { get; set; }
    public virtual Lab Lab { get; set; }

    [ForeignKey("RouteMemberType")]
    public int RouteMemberTypeId { get; set; }
    public virtual RouteMemberType RouteMemberType { get; set; }
}
路线

public class Route : BaseModel {
    public String Name { get; set; }
    public String ShortName { get; set; }
    public virtual ICollection<RouteMember> RouteMembers { get; set; }
}
public class RouteMemberType : BaseModel {
    public String Name { get; set; }
}
实验室

public class Lab : BaseModel {
    public String Name { get; set; }
    public String ShortName { get; set; }
    public String Description { get; set; }

    [ForeignKey("Building")]
    public int BuildingId { get; set; }
    public virtual Building Building { get; set; }
}
RouteMemberType

public class Route : BaseModel {
    public String Name { get; set; }
    public String ShortName { get; set; }
    public virtual ICollection<RouteMember> RouteMembers { get; set; }
}
public class RouteMemberType : BaseModel {
    public String Name { get; set; }
}
请求输入

{
"id":0,
"name":"t1",
"shortName":"t1",
"routeMembers":[
    {
        "active":true,
        "labId":11,
        "lab":{
            "$id":"1",
            "building":null,
            "name":"t1a",
            "shortName":"t1a",
            "description":"t1a",
            "buildingId":2,
            "id":11,
            "active":true
        },
        "routeMemberTypeId":1,
        "routeMemberType":{
            "$id":"1",
            "name":"Destintation",
            "id":1,
            "active":true
        }
    },
    {
        "active":true,
        "labId":12,
        "lab":{
            "$id":"2",
            "building":null,
            "name":"t2a",
            "shortName":"t2a",
            "description":"t2a",
            "buildingId":2,
            "id":12,
            "active":true
        },
        "routeMemberTypeId":2,
        "routeMemberType":{
            "$id":"2",
            "name":"Fringe",
            "id":2,
            "active":true
        }
    }
],
"active":true
}

虽然我仍然无法完全满意地解决这个问题,但它在某些方面似乎与

json.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
在WebApiConfig中。关闭对象引用,允许绑定RouteMemberTypes。为了解决这个问题,我使用了PreserveReferencesHandling.None并手动执行引用完整性。如果我找到更好的解决方案,我会更新