gpt4 book ai didi

azure - 我们如何获取未跟踪的Azure表存储实体的ETag?

转载 作者:行者123 更新时间:2023-12-01 04:08:20 24 4
gpt4 key购买 nike

我们有一个解决方案,可以并行读取和写入 Azure 表存储。

由于 TableServiceContext 不支持在一个线程上读取实体并将其保存在另一个线程上,因此我们希望使用另一个 Context 来保留该实体。为此,我们需要设置:

context.MergeOption = MergeOption.NoTracking;

当更新(或删除)一个实体时,我们调用:

context.AttachTo(entitySetName, entity, eTag);

但是要做到这一点,我们需要知道 ETag,但我不知道如何获取它。

如果实体被跟踪,我们可以像这样使用 EntityDeciptor.ETag:

private string GetETagFromEntity<T>(T entity) where T : TableServiceEntity
{
return context.Entities.Single(entityDescriptor =>
entityDescriptor.Entity == entity).ETag;
}

...但是 context.Entities 是空的,因为我们不跟踪实体。

我们目前找到的唯一解决方案是:

context.AttachTo(entitySetName, entity, "*");

...但这意味着我们存在并发问题,最后写入的总是获胜。

我们还尝试构建以下内容,该内容适用于本地计算模拟器,但不适用于云:

private string GetETagFromEntity<T>(T entity) where T : TableServiceEntity
{
string datePart = entity.Timestamp.ToString("yyyy-MM-dd");
string hourPart = entity.Timestamp.ToString("HH");
string minutePart = entity.Timestamp.ToString("mm");
string secondPart = entity.Timestamp.ToString("ss");
string milisecondPart = entity.Timestamp.ToString("fff").TrimEnd('0');

return string.Format(
"W/\"datetime'{0}T{1}%3A{2}%3A{3}.{4}Z'\"",
datePart,
hourPart,
minutePart,
secondPart,
milisecondPart
).Replace(".Z", "Z");
}

即使我们可以让它发挥作用,这种方法的普遍问题是 Microsoft 不对 ETag 的外观做出任何保证,因此这可能会随着时间的推移而改变。

所以问题是:我们如何获取未跟踪的 Azure 表存储实体的 ETag?

最佳答案

我认为您在阅读实体时必须记下 etag。 (可能有一个您可以 Hook 的事件,也许是 ReadingEntity,您可以在其中访问 etag 并将其存储在某个地方。)

关于azure - 我们如何获取未跟踪的Azure表存储实体的ETag?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7859303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com