在Azure存储中(在C#中使用TableClient),更新实体时如何获取(更新的)ETag?

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

我正在运行一个多阶段流程,需要更新给定的实体(在流程开始之前已经存在)多次。后续更新之间存在一段时间,在此期间其他方应观察实体的中间状态。而且他们不会在这个过程中应该改变实体,但我不能假设他们真的不会。

因此,一开始我检索现有实体 (

tableClient.GetEntityIfExistsAsync<MyEntity>
),并记下其
ETag

然后,第一次更改实体时,我使用之前的 ETag 值来确保我仍在使用原始实体,并且中间没有人更改过它:

tableClient.UpdateEntityAsync(myUpdatedEntity, originalETag)

到目前为止一切顺利,但是现在当我想再次更改实体时该怎么办?我没有更新的 ETag,如果我尝试再次检索它以便获得新的 ETag,我将面临更新和查询之间它已被更改的风险。

那么有没有办法在更新实体时(原子地)获取实体的(更新后的)ETag?

c# azure concurrency azure-storage etag
2个回答
0
投票

您应该能够在响应标头中获取

ETag
的最新值。

请尝试以下操作:

var result = await tableClient.UpdateEntityAsync(myUpdatedEntity, originalETag);
var headers = result.Headers;
var etag = headers.ETag;

参考:https://learn.microsoft.com/en-us/dotnet/api/azure.response?view=azure-dotnet


0
投票

您可以使用TableClient类提供的UpdateEntityAsync方法。更新实体后,该方法将返回更新后的实体以及新的 ETag 值。

var tableClient = new TableClient(connectionString, tableName);
TableEntity entity = await tableClient.GetEntityAsync<TableEntity> 
                            (partitionKey, rowKey);
entity.SomeProperty = "New Value";
Response<TableEntity> response = await 
                                 tableClient.UpdateEntityAsync(entity);
var updatedETag = response.Value.ETag;
© www.soinside.com 2019 - 2024. All rights reserved.