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

pn9klfpd  于 2023-11-21  发布在  C#
关注(0)|答案(2)|浏览(141)

我正在运行一个多阶段的流程,它需要更新一个给定的实体(在流程开始之前已经存在)* 多次 *。在后续更新之间有一段时间,在此期间,其他各方应该观察实体的中间状态。他们不应该在流程中更改实体,但我不能假设他们真的不会。
因此,在开始时,我检索现有实体(tableClient.GetEntityIfExistsAsync<MyEntity>),并注意到它的ETag
然后,当我第一次更改实体时,我使用之前的ETag值来确保我仍然使用原始实体,并且没有人在tableClient.UpdateEntityAsync(myUpdatedEntity, originalETag)之间更改它。
到目前为止一切顺利,但是当我想再次更改实体时该怎么办?我没有更新的ETag,如果我再次尝试检索它以获得新的ETag,我会冒着在更新和查询之间它被更改的风险。
那么,有没有什么方法可以在更新实体时(原子地)获得实体的(更新的)ETag呢?

eqfvzcg8

eqfvzcg81#

您应该能够在响应头中获取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 .

tktrz96b

tktrz96b2#

您可以使用TableClient类提供的UpdateValidityAsync方法。更新实体后,该方法将返回更新后的实体沿着新的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;

字符串

相关问题