我正在运行一个多阶段流程,需要更新给定的实体(在流程开始之前已经存在)多次。后续更新之间存在一段时间,在此期间其他方应观察实体的中间状态。而且他们不会在这个过程中应该改变实体,但我不能假设他们真的不会。
因此,一开始我检索现有实体 (
tableClient.GetEntityIfExistsAsync<MyEntity>
),并记下其 ETag
。
然后,第一次更改实体时,我使用之前的 ETag 值来确保我仍在使用原始实体,并且中间没有人更改过它:
tableClient.UpdateEntityAsync(myUpdatedEntity, originalETag)
。
到目前为止一切顺利,但是现在当我想再次更改实体时该怎么办?我没有更新的 ETag,如果我尝试再次检索它以便获得新的 ETag,我将面临更新和查询之间它已被更改的风险。
那么有没有办法在更新实体时(原子地)获取实体的(更新后的)ETag?
您应该能够在响应标头中获取
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。
您可以使用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;