Azure 数据表 `UpdateMerge` 和 `UpsertMerge` 具有相同的行为吗?

问题描述 投票:0回答:1

鉴于前者已弃用,我正在从 Microsoft.Azure.Cosmos.Table => Azure.Data.Tables 转换代码库,并且在大多数情况下,我发现有代表性的方法在新的 api 中,我在上一个版本中使用了所有内容,但有一个例外:TableBatchOperation 类上的合并操作。

根据新 api 的文档,等效的应该是

TableTransactionType.UpdateMerge
,如果您想以类似于原始
TableBatchOperation.Merge
的方式进行批处理,您只需创建一个集合
TableTransactionAction
并指定
TableTransactionType.UpdateMerge
作为操作类型,该集合与您的实体一起传递给
yourClientTable.SubmitTransactionAsync

例如

List<TableTransactionAction> myBatch = new List<TableTransactionAction>();
myBatch.AddRange(someListOfEntities.Select(e => new TableTransactionAction(TableTransactionActionType.UpdateMerge, e)));
return myTableClient.SubmitTransactionAsync(myBatch);

我注意到的是,虽然文档表明这应该仅对现有实体执行更新,但它的行为更像是指示的

UpsertMerge
,因为如果实体不存在,它将创建它。

这与 Cosmos SDK 表 api 的行为相反,在 Cosmos SDK 表 api 中尝试使用不存在的实体进行

Merge
会引发错误。还有其他人有过 Azure Data Tables api
UpdateMerge
UpsertMerge
表现相同的经历吗(尽管有迹象表明它们不应该)?

来自 Azure 数据表文档: indicating UpdateMerge is equivalent to TableClient.UpdateEntity in
用于合并的cosmos文档

用于更新实体和模式的 Azure 数据表文档

c# azure-cosmosdb azure-cosmosdb-tables
1个回答
0
投票

看来你需要在创建TableEntity实例时添加

{ ETag = Azure.ETag.All }

例如:

TableEntity tableEntity = new TableEntity("partitionKey", "rowKey") { ETag = Azure.ETag.All };

您可以在这里查看说明。

© www.soinside.com 2019 - 2024. All rights reserved.