深度插入和$batch OData之间的差异

深度插入和$batch OData之间的差异,odata,Odata,有人能告诉我在OData上下文中使用Deep Insert和$batch-ChangeSet的区别吗?我有一个场景,需要同时创建销售订单标题和销售订单项 我可以选择用户深度插入(顺便说一句,这是标准OData规范吗?) 我可以使用$batch(这是标准OData规范)调用将这两个实体指定为同一变更集的一部分,这将确保它们作为单个LUW的一部分保存在一起 使用这两种方法的优缺点是什么?有什么经验吗? CheersOData规范目前未定义和支持深度插入或深度更新。但是,也有这样的功能请求,例如:

有人能告诉我在OData上下文中使用Deep Insert和$batch-ChangeSet的区别吗?我有一个场景,需要同时创建销售订单标题和销售订单项

  • 我可以选择用户深度插入(顺便说一句,这是标准OData规范吗?)
  • 我可以使用$batch(这是标准OData规范)调用将这两个实体指定为同一变更集的一部分,这将确保它们作为单个LUW的一部分保存在一起
使用这两种方法的优缺点是什么?有什么经验吗?
Cheers

OData规范目前未定义和支持深度插入或深度更新。但是,也有这样的功能请求,例如:

如果决定使用批处理,则必须执行批处理中的下一组命令:

  • 放置SalesOrderItem
  • 放置SalesOrderItem
  • 放置SalesOrderHeader
  • 放置SalesOrderHeader/links$/SalesOrderItem
  • 放置SalesOrderHeader/links$/SalesOrderItem
另见此处:


在我们的ASP.NET项目中,我们决定使用CQRS模式,并使用OData作为查询请求,使用WebAPI作为命令。就您的案例而言,我们使用CreateSalesOrder操作创建了Web API控制器,其参数为包含SalesOrderItemDTO数组的SalesOrderHeaderTo类。有了服务器上的数据,您可以很容易地开发插入整个订单销售在一个交易及其订单项目。另外,服务器上只需发送两个命令-~/api/CreateSalesORder和~/odata/SalesOrder with include=Items,并通过某种方式进行过滤。。。例如,第一个命令可以返回订单Id…

深插入是OData规范的一部分,请参阅

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

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


对于仅插入的情况,深度插入更容易:您只需发布与$expand相同的格式。

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

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

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

$batch需要在一个变更集中,以期望原子性。 根据:

变更集中的所有操作都表示一个变更单元,因此服务必须成功处理并应用变更集中的所有请求,否则将不应用任何请求。由服务实现来定义回滚语义,以撤销变更集中的任何请求,这些请求可能在同一变更集中的另一个请求失败之前就已经被应用,从而应用这个“要么全有,要么全无”的要求。服务可以以任何顺序执行变更集中的请求,并且可以以任何顺序返回对单个请求的响应。服务必须在每个响应中包含内容ID头,其值与客户端在相应请求中指定的值相同,以便客户端可以关联请求和响应

但是,只有一个变更集是可用的。如果您正在进行深度插入,则实体之间存在一些关系,如果您正在进行插入,在包含的导航或$ref导航中,您无法以无序方式执行两个插入或两个插入以及PUT/POST$ref

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


离题,但你是否仍积极参与?如果社区能直接从你那里得到答案,那就太好了。例如。