从客户端删除一个请求中的所有相关OData实体

时间:2014-06-13 20:52:22

标签: c# odata breeze olingo

以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。其中任何一个例子都会非常感激。

编辑:澄清我只是删除引用,而不是实际删除实体本身。

4 个答案:

答案 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);

以上是我使用的两种方式。如果您找到更好的解决方案,请告诉我。