据我了解,基于 OData 的服务支持“upsert”(即插入一行,或者如果具有此键的行已存在则更新它)的常用方法是通过包含过滤器的 PUT 请求用于行键和分区键。
http://myaccount.table.core.windows.net/mytable(PartitionKey='myPartitionKey', RowKey='myRowKey1')
据我所知,这就是Azure表存储支持upsert的方式。但据我所知,如果您在使用 .NET Framework 的内置实现的自己的 OData 服务上尝试同样的操作 DataService<T>
,只有当该行已经存在时才会成功。如果该行不存在,我会收到 404 错误。
换句话说,这仅适用于更新,不适用于插入。
我怀疑根本不支持 upsert,但一直无法找到明确的答案。谁能告诉我如何做到这一点,或者确认我绝对不能?
最佳答案
您可以尝试创建自己的自定义查询提供程序(IDataServiceQueryProvider 的实现)。如果用户请求的单个对象不存在并且当前 http 请求的方法是 PUT,则返回一个具有给定 id 的新对象。我认为内置更新提供程序应该能够从那里处理它并更新记录。否则,您可能还需要自己的更新提供程序。
使用WCF Data Services Toolkit可能会让你的工作更轻松。否则,您将不得不编写自己的 linq 提供程序,这对于集成测试来说听起来有点大材小用。
This msdn 上有一系列不错的博客文章,描述了如何构建自定义 ds 提供程序。
关于wcf-data-services - DataService<T> 是否支持Upsert(插入或替换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124186/