ITableEntity中ETag的目的是什么

时间:2013-07-03 06:44:52

标签: azure-table-storage

对于ITableEntity中的ETag,

MSDN说: 获取或设置实体的当前ETag。将此值设置为“*”,以便在更新操作中盲目覆盖实体。

我无法理解这个属性的目的,请解释我们何时以及何时可以使用此属性。

2 个答案:

答案 0 :(得分:30)

ETag不是时间戳,或者至少不再是时间戳。还有另一个Timestamp属性是上次更新记录的时间。 ETag用于并发。如果您加载表实体并想要更新它,则传递以从加载值时更新ETag,并且仅当该ETag与存储的内容匹配时才会更新实体。

为什么要关心?好吧,如果您有多个用户同时在表单上编辑相同的项目,您不希望一个用户更改以覆盖另一个用户,而不会通知第二个用户他们正在覆盖已更改的数据加载它。

示例:用户1和用户2同时加载编辑页面。用户1更改字段1的值并保存该项目。在用户2使项目打开一点之后,用户2对不相关的字段2进行了更改,并且在不知不觉中,过时的字段1正在与其更新一起保存。除非您告诉用户2,否则用户2不知道他们正在丢弃用户1的更改。所以你应该做的是显示用户1已经改变它的错误,他们是否确定要覆盖用户1的更改,或者他们是否希望首先看到这些更改。

这是由用户1和用户2在隐藏在表单显示上的记录加载时存储ETag来完成的。当每个用户尝试保存时,您可以将该ETag传递给具有更新数据的服务器。这如何告诉用户2正在更改过期记录?因为对记录的每次更改都会更新为该记录存储的ETag。因此,当用户2尝试保存您发送的ETag时,他们的更改将无法匹配,Azure将告诉您,以便您可以处理应该执行的操作。

现在,如果您不在乎用户2可能会覆盖用户1的更改,那么请传递" *"保存时,Azure不会在ETag不匹配时给出错误。

答案 1 :(得分:2)

ETag属性是实体时间戳。您可以在ReadingEnitity Event中阅读ETag属性。

void OnContextReadingEntity(object sender, ReadingWritingEntityEventArgs e) 
{ 
    string eTag = e.Data.FirstAttribute.Value; 
} 

有关详细信息,请参阅以下主题How to use Windows Azure Table Storage Timestamp or Etag field

的讨论