【问题标题】:How to PATCH an entity with a composite primary key?如何使用复合主键修补实体?
【发布时间】:2016-06-20 06:22:07
【问题描述】:

我有一个具有复合主键的实体,我可以使用以下方法检索它的单个实例:

GET https://example.com/service/Contacts(Foo=3,Bar=18) 

如何更新它的实例?我尝试了使用相同地址的 PATCH:

PATCH https://example.com/service/Contacts(Foo=3,Bar=18) 

但我得到下一个错误:

{
    "error" : {
        "code" : "",
        "message" : "The request is invalid.",
        "innererror" : {
            "message" : "key : Expected literal type token but found token 'Foo'.\r\n",
            "type" : "",
            "stacktrace" : ""
        }
    }
}

这个错误是什么意思?

我也尝试不使用属性名称,但出现另一个错误:

PATCH https://example.com/service/Contacts(3,18) 

无法创建抽象类。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

知道在这种情况下我该如何做 PATCH 吗?

谢谢。

【问题讨论】:

    标签: .net asp.net-web-api odata endpoint asp.net-web-api-odata


    【解决方案1】:

    可能是我参加聚会太晚了,但现在补齐了

    请注意,这是 OData v6 (System.Web.OData) 和具有手动模型设置的实体框架。我认为,以前版本的 OData 不支持此功能。

    在控制器中,动作 Patch 必须具有由 'key'+{ModelPropertyName} 组成的参数。考虑到您的模型具有属性FooBar,控制器操作应如下所示。

    public async Task<IHttpActionResult> Patch([FromODataUri] int keyFoo, [FromODataUri] int keyBar, Delta<FooBarModel> modelDelta)
    

    请注意,参数的大小写无关紧要。如果你愿意,你可以像KeyFoO 一样拥有它们。但它确实在 URL 上很重要

    补丁https://example.com/service/Contacts(Foo=3,Bar=18)

    这里的外壳很重要。这行不通

    补丁https://example.com/service/Contacts(foo=3,bar=18)

    顺序无关紧要,这样就可以了

    补丁https://example.com/service/Contacts(Bar=18, Foo=3)

    这行不通

    补丁https://example.com/service/Contacts(3,18)

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多