2012-11-27 15 views
2

我正在尋找使用Delta包裝器對Web api控制器操作進行部分更新。MVC4 WebApi OData Delta <T>未填充GUID或Int字段

我有一個像這樣的模式:

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; } 
} 

我有API控制器像這樣:

public void Put(Delta<Person> person) 
    { 
     var p = person.GetEntity(); 

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

     person.Patch(existingPerson); 

     _repository.Update(); 

     return; 
    } 

我做像這樣(使用招)的調用Web API

url: http://localhost:49933/api/Person (PUT) 


Response Body 
    { 
     "PersonId": "b269c49f-8a90-41d6-b102-7cfba3812b1c", 
     "FirstName": "sample string 2", 
     "LastName": "sample string 3", 
     "IsActive": true, 
     "NumVacationDays": 5, 
     "Salary": 6.1 
    } 

The controller is hit and al 

l除NumVacationDays(即0)和PersonId(默認爲00000000-00 00-0000-0000-000000000000)

有誰知道爲什麼GUID和INT字段不是從JSON填充?

回答

0

我可以冒險猜測PersonId發生了什麼,但NumVacationDays無法解釋。我的猜測是PersonId是Person實體的關鍵屬性,默認情況下ODataFormatter不會修補關鍵屬性。如果您想要這種行爲,可以將ODataMediaTypeFormatter.PatchKeyMode上的設置更改爲Patch。

另外,在action中查看person.GetChangedPropertyNames()的值是否會很有趣,以查看PersonId和NumVacationDays是否實際顯示在那裏。

+0

Hi RaghuRam。謝謝回覆。爲了測試你的理論,我添加了兩個新列:CompanyId,它是一個GUID,NumDaysTaken是一個int。兩者都作爲默認發送(與上面相同)。 GetChangedPropertyNames的結果有其他4列(名字,姓氏,IsActive,薪水) –

+2

您是否使用針對JsonMediaTypeFormatter而不是ODataMediaTypeFormatter的Delta ?使用Delta 與json格式化程序不是受支持的方案。我已經測試過odata格式化程序以及guid和int的工作。 –

+0

嗨紅葉,是的,我是。我將研究odata格式化程序。謝謝! –

3

在這個bug中提到了這個問題:http://aspnetwebstack.codeplex.com/workitem/562 ...聲明被修復但仍然存在於4.0剛剛發佈的版本中。

問題是Newtonsoft Json將一個數字反序列化爲一個Int64,它無法將IsAssignable測試爲一個int,因此它被跳過。類似的問題guids作爲字符串。

您應該可以通過使用OData媒體類型格式化程序來解決此問題,該格式化程序是通過派生自ODataController而不是ApiController來啓用的。然而,這對我沒有影響 - int值仍然不起作用(但是當我將數據類型更改爲Int64時,它的工作原理)。

我很想看到一個工作示例,發佈包含int的補丁delta的json。

+0

這顯然也會影響DateTimes。你不能修補「2015-06-17T00:00」它必須是完整的「2015-06-17T00:00:00.000」。當我測試這個時,我注意到changedProperties不會返回Newtonsoft Json無法反序列化的值(如greg指出的那樣),但當傳遞null時,它總是顯示出來。所以補丁與Null是一個偉大的理智檢查我.. – J3RM