Asp.net mvc 4 MVC4 WebApi奥达塔三角洲<;T>;未填充guid或Int字段

Asp.net mvc 4 MVC4 WebApi奥达塔三角洲<;T>;未填充guid或Int字段,asp.net-mvc-4,asp.net-web-api,odata,Asp.net Mvc 4,Asp.net Web Api,Odata,我希望通过使用Delta包装器对webapi控制器操作进行部分更新 我有这样一个模型: public class Person { public Guid PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public bool IsActive { get; set; } public int NumV

我希望通过使用Delta包装器对webapi控制器操作进行部分更新

我有这样一个模型:

public class Person
{
    public Guid PersonId { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public bool IsActive { get; set; }

    public int NumVacationDays { get; set; }

    public double Salary { get; set; }
}
    public void Put(Delta<Person> person)
    {
        var p = person.GetEntity();

        Person existingPerson = _repository.Get(p.PersonId);

        person.Patch(existingPerson);

        _repository.Update();

        return;
    }
我有这样的api控制器:

public class Person
{
    public Guid PersonId { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public bool IsActive { get; set; }

    public int NumVacationDays { get; set; }

    public double Salary { get; set; }
}
    public void Put(Delta<Person> person)
    {
        var p = person.GetEntity();

        Person existingPerson = _repository.Get(p.PersonId);

        person.Patch(existingPerson);

        _repository.Update();

        return;
    }
l填充的数据不是NumVacationDays(0)和PersonId(默认为00000000-0000-0000-0000-000000000000)


有人知道为什么guid和int字段不是从json填充的吗?

我可以大胆猜测PersonId发生了什么,但是NumVacationDays无法解释。我猜PersonId是Person实体的键属性,默认情况下ODataFormatter不修补键属性。如果需要该行为,可以将ODataMediaTypeFormatter.PatchKeyMode上的设置更改为Patch


此外,在操作中查看person.GetChangedPropertyNames()的值,以查看PersonId和NumVacationDays是否实际显示在那里,这将是一件有趣的事情。

此错误中提到了此问题:…声称已修复,但在刚刚发布的4.0中仍然存在

问题在于,Newtonsoft Json将一个数字反序列化为Int64,该数字未能通过可分配给int的测试,因此被跳过。guid作为字符串的类似问题

您应该能够通过使用OData媒体类型格式化程序来解决这个问题,OData媒体类型格式化程序是通过从ODataController而不是ApiController派生来启用的。但是,这对我没有影响-int值仍然不起作用(但是当我将数据类型更改为Int64时,它起作用)


我希望看到一个使用包含int的补丁增量发布json的工作示例。

Hi RaghuRam。谢谢你的回复。为了验证您的理论,我添加了两个新列:CompanyId是一个guid,NumDaysTaken是一个int。这两个列都作为默认值发送(如上所述)。GetChangedPropertyNames的结果有其他4列(FirstName、LastName、IsActive、Salary)。您是否对JsonMediaTypeFormatter而不是ODataMediaTypeFormatter使用增量?不支持将增量与json格式化程序一起使用。我已经测试了odata格式化程序以及guid和int工作。嗨,红叶,是的,我是。我将研究odata格式化程序。谢谢这显然也会影响日期时间。您不能使用“2015-06-17T00:00”进行修补,它必须是完整的“2015-06-17T00:00:00.000”。当我测试这个时,我注意到changedProperties不会返回它可能返回的值,Newtonsoft Json无法反序列化(正如greg指出的),但是当传递null时,它总是显示出来。因此,使用Null进行修补对我来说是一个很好的精神检查。。