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

如何获取未跟踪的Azure表存储实体的ETag?,azure,azure-table-storage,Azure,Azure Table Storage,我们有一个解决方案,可以并行读取和写入Azure表存储 由于TableServiceContext不支持在一个线程上读取实体并将其保存在另一个线程上,因此我们希望使用另一个上下文保留实体。为此,我们需要设置: context.MergeOption = MergeOption.NoTracking; 当更新(或删除)我们称之为的实体时: context.AttachTo(entitySetName, entity, eTag); 然而,要做到这一点,我们需要知道ETag,我不知道如何得到它

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

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

context.MergeOption = MergeOption.NoTracking;
当更新(或删除)我们称之为的实体时:

context.AttachTo(entitySetName, entity, eTag);
然而,要做到这一点,我们需要知道ETag,我不知道如何得到它

如果跟踪实体,我们可以使用EntityDescriptor.ETag,如下所示:

private string GetETagFromEntity<T>(T entity) where T : TableServiceEntity
{
    return context.Entities.Single(entityDescriptor =>
                                   entityDescriptor.Entity == entity).ETag;
}
。。。但这意味着我们有并发问题,最后一个写的总是赢的

我们还尝试构建以下在本地Compute Emulator上工作但不在云中工作的组件:

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");
}
私有字符串GetETagFromEntity(T实体),其中T:TableServiceEntity
{
字符串datePart=entity.Timestamp.ToString(“yyyy-MM-dd”);
字符串hourPart=entity.Timestamp.ToString(“HH”);
字符串minutePart=entity.Timestamp.ToString(“mm”);
字符串secondPart=entity.Timestamp.ToString(“ss”);
字符串MilisSecondPart=entity.Timestamp.ToString(“fff”).TrimEnd('0');
返回字符串格式(
“W/\“datetime'{0}T{1}%3A{2}%3A{3}.{4}Z'\”,
日期部分,
霍尔巴特,
每分钟,
第二部分,
第二部分
).替换(“.Z”、“Z”);
}
这种方法的普遍问题是,即使我们能够让它工作,微软也不会对ETag的外观做出任何评价,因此这可能会随着时间的推移而改变


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

我认为在读取实体时必须注意ETag。(可能有一个事件您可以挂接,可能是ReadingEntity,您可以在那里访问etag并将其存储在某处。)

我已经编写了一个备用表存储客户端,它在公开etag时非常明确,可以使用上下文无关且线程安全。它可能对你有用。请访问www.lucifure.com。

谢谢。。。我把这个标记为正确答案。您可以使用以下(丑陋的)代码获取ReadingEntity事件上的etag:void OnContextReadingEntity(对象发送方,ReadingWritingEntityEventTargets e){string etag=e.Data.FirstAttribute.Value;}这非常慢。我做的一个手术只需要几秒钟,现在只需要2分钟!更多地解释经济放缓(可能是一个新问题)。我不明白为什么挂起这个事件会影响性能。
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");
}