Deep Insert和$ batch OData之间的区别

时间:2014-01-30 05:51:56

标签: odata

任何人都可以告诉我在OData的上下文中使用Deep Insert和$ batch - ChangeSet之间的区别吗?我有一个场景需要一起创建销售订单表头和销售订单项目。

  • 我可以使用Deep Insert(BTW是这个标准的OData规范吗?)还是
  • 我可以使用$ batch(这是标准的OData规范)调用,将这两个实体指定为同一ChangeSet的一部分,这将确保它们作为单个LUW的一部分保存在一起。

使用这两种方法有哪些优点/缺点?任何经历? 干杯

3 个答案:

答案 0 :(得分:5)

深度插入是OData规范的一部分,请参阅http://docs.oasis-open.org/odata/odata/v4.0/os/part1-protocol/odata-v4.0-os-part1-protocol.html#_Toc372793718

深度插入允许在一个请求中创建相关实体的树。它只是插入。

$ batch允许将任意请求分组为一个请求,并将操作任意修改为LUW(称为更改集)。

对于仅插入的情况,深度插入更容易:您只需使用$ expand来获取与GET相同的格式。

答案 1 :(得分:0)

OData规范当前未定义和支持深度插入或深度更新。但是有这样的功能请求,例如:https://data.uservoice.com/forums/72027-wcf-data-services-feature-suggestions/suggestions/4416931-odata-deep-update-request-support

如果您决定使用批处理,那么您必须在批处理中执行下一组命令:

  • PUT SalesOrderItem
  • ...
  • PUT SalesOrderItem
  • PUT SalesOrderHeader
  • PUT SalesOrderHeader / links $ / SalesOrderItem
  • ...
  • PUT SalesOrderHeader / links $ / SalesOrderItem

另见:How do I update an OData entity and modify its navigation properties in one request?

在我们的ASP.NET项目中,我们决定采用CQRS模式,并将OData用于查询请求和Web API for Commands。根据您的情况,我们创建了Web API Controller,其操作CreateSalesOrder,参数为SalesOrderHeaderDto,其中包含SalesOrderItemDtos数组。将数据放在服务器上,您可以轻松开发将整个订单销售与其订单项一起插入一个交易中。还有两个命令要在服务器上发送 - 〜/ api / CreateSalesORder和〜/ odata / SalesOrder with include = Items and filter by something ...例如first command可以返回Order的Id ...

答案 2 :(得分:0)

深插入提供一个操作,将所有项目作为一个操作插入。

同样的事情在$ batch中是不可能的。 这在批处理中不是自动的:

  

它们作为单个LUW的一部分保存在一起

$ batch需要在单个更改集中以期望原子性。 根据{{​​3}}:

  

更改集中的所有操作都代表一个更改单元,因此服务必须成功处理并应用更改集中的所有请求,否则不应用它们。由服务实现来定义回滚语义以撤消在同一更改集中的另一个请求失败之前可能已应用的更改集内的任何请求,从而应用此全有或全无要求。服务可以按任何顺序在变更集内执行请求,并且可以按任何顺序将响应返回给各个请求。服务必须在每个响应中包含Content-ID头,其值与客户端在相应请求中指定的值相同,因此客户端可以关联请求和响应。

但是,单个变更集为OData 4.0 11.7.4 Responding to a Batch Request。鉴于您正在进行深度插入,实体之间存在一些实现,并且假设您正在执行插入操作,无论是在包含的导航还是$ ref导航中,您都无法执行两个插入或两者都执行插入和PUT / POST $ ref以无序方式。

  

更改集是一个原子工作单元,由一个或多个数据修改请求或操作调用请求的无序组组成。