如何使用复合主键修补实体?

时间:2016-06-20 06:22:08

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

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

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?

谢谢。

1 个答案:

答案 0 :(得分:0)

可能是我来不及参加聚会,但这里是为了补丁

请注意,这是OData v6(System.Web.OData)和带有手动模型设置的Entity Framework。我认为,以前版本的OData并不支持这种开箱即用。

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

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

请注意,论证上的内容并不重要。如果您愿意,可以将它们设为KeyFoO。但这在URL

上确实很重要
  

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

这里的外壳是重要的。这不会起作用

  

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

订单不重要,这将有效

  

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

这不起作用

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