以Northwind数据库为例,每个Customer都有一个Orders集合。我想在一个请求中删除特定客户与其所有订单之间的所有引用。
看起来我可以使用DELETE http://services.odata.org/V4/Northwind/Northwind.svc/Customers('ANTON')/Orders
执行此操作(基于spec),但我想知道客户端库是否支持此功能。
我正在使用Microsoft.OData.Client作为C#客户端库,使用Apache Olingo(v4)作为Java,使用BreezeJS for JavaScript。其中任何一个例子都会非常感激。
编辑:澄清我只是删除引用,而不是实际删除实体本身。
答案 0 :(得分:5)
正如swl10所说,你需要依次删除每个引用。但OData支持$ batch。您可以将所有删除方法放在一个请求中。 代码如下:
DemoService dsc = new DemoService(new Uri("http://services.odata.org/V4/OData/(S(ut2byeiaglm424a0pbovpo33))/OData.svc/"));
var product = dsc.Products.Expand("Categories").Where(p => p.ID == 1).Single();
foreach (var c in product.Categories)
{
dsc.DeleteLink(product, "Categories", c);
}
dsc.SaveChanges(SaveChangesOptions.BatchWithSingleChangeset);
您会发现此SaveChanges只会发送一个请求$ batch。在有效负载中,有两个内部DELETE请求。
答案 1 :(得分:4)
鉴于之前对此问题的澄清,您希望删除引用而不是实体本身,答案似乎是否定,您无法做您想做的事。
在OData 4(您链接的规范)中,使用$ ref获取引用,而不是直接寻址实体。因此,您感兴趣的链接就是这个:
http://services.odata.org/V4/Northwind/Northwind.svc/Customers('ANTON')/Orders/$ref
不幸的是,你无法做到你想要的,正如协议所说的那样(语法改进):
可以在DELETE请求中使用寻址单个实体引用的资源路径 不相关的两个实体。可以使用寻址参考集合的资源路径 DELETE请求后面跟着系统查询选项$ id标识其中一个 集合中的实体引用。
规范编写者在从协议中删除您希望执行的操作时遇到了一些麻烦。您必须依次删除每个引用,不能在一个协议请求中删除整个引用集合。
答案 2 :(得分:0)
您是要删除客户('ANTON')和订单之间的引用,还是删除客户('ANTON')下的订单实体?
如果您以后需要,服务不应该根据协议提供这种删除。
如果您只想删除引用,可以从客户端尝试“PATCH”“Customers('ANTON')”。
答案 3 :(得分:0)
如果我理解正确,您想要删除父实体及其所有子项? 你可以按照这些:
1 / Deleting Entities and its Navigation Properties这是Jay Traband建议的“最简单的方法”。
2 /另一种方法,你可以为每个实体设置删除:
var deletedEntities = Array();
Customers.entityAspect.setDeleted();
deletedEntities.push(Customers);
for( var i=0; i<Customers().Orders().length; i++){
Customers().Orders()[i].entityAspect.setDeleted();
deletedEntities.push(Customers().Orders()[i]);
}
manager.saveChanges(deletedEntities).then(saveSucceed).fail(saveFailed);
以上是我使用的两种方式。如果您找到更好的解决方案,请告诉我。