2017-02-14 129 views
1

我有一個WebApi 2控制器。我想在其中一個控制器上使用OData補丁。這是我到目前爲止所做的。OData補丁沒有更新數據庫

我在控制器中添加了以下行WebApiConfig

config.MapODataServiceRoute("odata", "odata", GenerateEdmModle()); 
private static Microsoft.OData.Edm.IEdmModel GenerateEdmModle() 
{ 
    var builder = new ODataConventionModelBuilder(); 
    builder.EntitySet<Auth>("Auths"); 

    return builder.GetEdmModel(); 
} 

然後,這是我想要使用補丁方法

[HttpPatch] 
public async Task<IHttpActionResult> PatchAuth(int id, Delta<Auth> value) 
{ 
    var auth = await db.Auth.FindAsync(id); 
    if (auth == null) return NotFound(); 

    System.Diagnostics.Debug.WriteLine(auth.direction, auth.id); 
    System.Diagnostics.Debug.WriteLine("Patching"); 

    try 
    { 
     value.Patch(auth); 
     await db.SaveChangesAsync(); 
    } 
    catch (Exception e) 
    { 
     System.Diagnostics.Debug.WriteLine(e.Message); 
     return InternalServerError(e); 
    } 
    return Ok(value); 
} 

這裏就是我如何從它發送角服務

// patch auth 
service.patchAuth = function (authId, auth) { 

    var request = $http({ 
     method: 'PATCH', 
     url: baseUrl + 'api/Auths', 
     data: JSON.stringify(auth), 
     params: { id: authId }, 
     headers: { 'Content-Type': 'application/x-www-form-urlencoded' } 
    }); 

    return (request.then(handleSuccess, handleError)); 
} 

這是我在小提琴手 看

我看到控制器找到了Patch Method,看起來好像在試圖更新,但是這個值永遠不會被更新。

我還在value.Patch(auth)上添加了一個斷點並檢查了changedProperties,但沒有任何內容。我一直在試圖找出造成這種情況的原因,但沒有得到任何線索。

+0

我面臨着同樣的問題,但只能用整數類型的值。字符串和布爾值正在更新,但不是整數。任何想法爲什麼?我已經嘗試了郵遞員的一切。它浪費了我的3天 –

回答

1

您指定application/x-www-form-urlencoded作爲您的內容類型。相反,你必須使用application/json

當您指定application/x-www-form-urlencoded時,調用仍然會被路由到正確的修補程序處理程序(與您的情況相同),但未通過Web.Api將更改的屬性傳遞到Delta<T>

當您檢查提琴手的原料 HTTP請求您的通話更應該是這樣的:

PATCH http://www.example.com/api/Auths(5) HTTP/1.1 
Content-Type: application/json 
Host: www.example.com 
Content-Length: 20 

{ "id" : 123456789 } 
+0

我曾嘗試過兩種方式,也許更多。它正在查找該功能,但只是沒有更新該屬性。我找到了JsonPatch,因爲我試圖爲此找到解決方案。它非常容易使用,並且完全像我想要的那樣工作。有關JsonPatch的更多信息,請訪問http://jsonpatch.com/ – Kuni

+0

感謝您的更新!我看了一下jsonpatch,這看起來很有趣。也許我可以在我的一些項目中使用這個。 但是,以前的實現肯定有問題,因爲'PATCH'正如我們幾個項目中所描述的那樣正常工作。仍然感謝鏈接! –

+0

不客氣。我敢肯定,我錯過了像我之前的實現,就像你說的。 – Kuni