2017-02-14 110 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