2

以 Northwind 数据库为例,每个 Customer 都有一个 Orders 集合。我想在一个请求中删除特定客户及其所有订单之间的所有引用。

看起来我可以做到这一点(基于规范),DELETE http://services.odata.org/V4/Northwind/Northwind.svc/Customers('ANTON')/Orders但我想知道客户端库是否支持这一点。

我将 Microsoft.OData.Client 用于 C# 客户端库,将 Apache Olingo (v4) 用于 Java,并将 BreezeJS 用于 JavaScript。任何这些中的一个例子将不胜感激。

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

4

4 回答 4

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 请求。

于 2014-06-17T14:54:30.043 回答
4

鉴于之前对该问题的说明是您希望删除引用而不是实体本身,答案似乎是否定的,您不能做您想做的事。

在 OData 4(您链接到的规范)中,引用是使用 $ref 获得的,而不是直接寻址实体。因此,您感兴趣的链接是这个:

http://services.odata.org/V4/Northwind/Northwind.svc/Customers('ANTON')/Orders/$ref

不幸的是,正如协议所说(针对语法进行了改进),您不能做您想做的事:

寻址单个实体引用的资源路径可用于 DELETE 请求以取消关联两个实体。如果资源路径后跟系统查询选项 $id 标识集合中的实体引用之一,则可以在 DELETE 请求中使用寻址引用集合的资源路径。

规范编写者费尽心思从协议中删除了您希望执行的操作。您必须依次删除每个引用,您不能在一个协议请求中删除整个引用集合。

于 2014-06-16T16:49:21.970 回答
0

您是要删除客户('ANTON')和订单之间的引用,还是删除客户('ANTON')下的订单实体?

如果您以后需要,该服务不应该根据协议提供这种删除。

如果您只想删除引用,可以尝试从客户端“PATCH”“Customers('ANTON')”。

于 2014-06-16T01:42:47.253 回答
0

如果我理解正确,您想删除父实体及其所有子实体吗?你可以按照这些:

1/删除实体及其导航属性 ,这是 Jay Traband 建议的“最简单的方法”。

2/ 另一种方式,您可以为每个实体 setDeleted:

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

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

于 2014-06-16T04:04:50.647 回答