【问题标题】:OData Patch is not updating the databaseOData 补丁未更新数据库
【发布时间】:2017-02-14 21:59:38
【问题描述】:

我有一个 WebApi 2 控制器。我想在其中一个控制器上使用 OData Patch。这是我到目前为止所做的。

我在 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));
}

这是我在 Fiddler 中看到的内容

我看到控制器找到了补丁方法,并且似乎正在尝试更新,但值永远不会更新。

我还在value.Patch(auth) 处添加了一个断点并检查了changedProperties,但什么也没有。我一直在试图找出造成这种情况的原因,但没有得到任何线索。

【问题讨论】:

  • 我面临同样的问题,但只有整数类型值。 string 和 bool 值正在更新,但不是整数。知道为什么吗?我已经尝试了邮递员的一切。它浪费了我的 3 天

标签: c# asp.net-web-api entity-framework-6 odata patch


【解决方案1】:

您将application/x-www-form-urlencoded 指定为您的内容类型。相反,您必须使用application/json

当您指定 application/x-www-form-urlencoded 时,调用仍会路由到正确的补丁处理程序(如您的情况),但是 Web.Api 不会将更改的属性传递到 Delta&lt;T&gt;

当您在 Fiddler 中检查 raw 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 }

【讨论】:

  • 我已经尝试了两种方法,也许还有更多。它正在寻找功能,但只是没有更新属性。当我试图找到解决方案时,我发现了 JsonPatch。它非常易于使用,并且完全按照我的意愿工作。有关 JsonPatch 的更多信息,请访问 jsonpatch.com
  • 感谢更新!我看了一下 jsonpatch,这看起来很有趣。也许我可以在我的一些项目中使用它。但是,您之前的实现一定有问题,因为PATCH 工作正常,正如我们的几个项目中所述。仍然感谢您的链接!
  • 不客气。正如你所说,我确定我之前的实现遗漏了一些东西。
猜你喜欢
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多