相关实体的 OData etag 处理

OData etag handling for related entities

我正在为销售订单构建 OData 服务 object。为简单起见,假设销售订单 object 有 2 个实体 - Header 和 Items。从业务角度来看,Header 具有根据项目金额值更新的总金额。

现在我有一个客户端应用程序,其中 Header 和 Items 都被获取并显示。当客户端应用程序获取订单时,Header 实体具有 Etag HE1,而 Item 实体(假设只有 1 个项目)具有 Etag 值 IE1。

客户端应用程序更新项目金额值。对项目执行 PATCH 调用,导致项目 Etag 从 IE1 -> IE2 更改。然而,即使在 Header 上没有进行显式更新,由于总量计算逻辑,Header Etag 在技术上也从 HE1 -> HE2 发生了变化。但是,由于 PATCH 操作仅在项目级别完成,客户端如何知道 Header etag 已更改?如果没有此信息,如果客户端现在尝试更新 header(通过单独的 PATCH 调用),这将失败,因为 header 的 ETag 同时发生了变化。

关于如何做到这一点有什么想法吗?

您提到的情况不仅会发生在 OData 服务中,而且会发生在使用乐观锁定的应用程序中。我看到的唯一解决方案是客户端应用程序必须知道更改销售订单项目也会影响销售订单 header.

因此,客户端应用程序必须在 PATCH 请求成功后重新加载 header 数据(可能使用批处理请求将 PATCH 绑定到项目上,并将 GET 绑定到 header 上)。此后,客户端应用程序知道更新的 header 数据和新的 header ETag 值。