对于 ITableEntity MSDN 中的 ETag 说:获取或设置实体的当前 ETag。将此值设置为“*”,以便在更新操作中盲目覆盖实体。
我无法理解该物业的用途,请解释我们为什么以及何时可以使用该物业。
对于 ITableEntity MSDN 中的 ETag 说:获取或设置实体的当前 ETag。将此值设置为“*”,以便在更新操作中盲目覆盖实体。
我无法理解该物业的用途,请解释我们为什么以及何时可以使用该物业。
ETag 不是时间戳,或者至少不再是。还有另一个 Timestamp 属性,即上次更新记录的时间。ETag 用于并发。如果您加载表实体并想要更新它,则从加载值时开始更新 ETag,并且仅当该 ETag 与存储的内容匹配时,它才会更新实体。
你为什么在乎?好吧,如果您有多个用户同时编辑表单上的同一项目,您不希望一个用户更改以覆盖另一个用户,而不会通知第二个用户他们正在覆盖自加载以来已更改的数据.
示例:用户 1 和用户 2 同时加载一个编辑页面。用户 1 更改字段 1 的值并保存项目。在用户 2 将项目打开一段时间后,用户 2 对不相关的字段 2 进行了更改,并且在不知情的情况下,过时的字段 1 正在与他们的更新一起保存。除非您告诉他们,否则用户 2 不知道他们正在放弃用户 1 的更改。因此,您应该做的是显示用户 1 已经更改它的错误,并且他们确定要覆盖用户 1 的更改,或者他们是否想先查看这些更改。
这是通过用户 1 和用户 2 存储 ETag 来实现的,该 ETag 从记录加载时隐藏在您的表单显示中。当每个用户尝试保存时,您可以将该 ETag 与更新的数据一起传递给服务器。这如何告诉您用户 2 正在更改过期记录?因为对记录的每次更改都会更新为该记录存储的 ETag。因此,当用户 2 尝试保存您发送的带有更改的 ETag 时,Azure 会告诉您,以便您可以处理应该做的事情。
现在,如果您不关心用户 2 可能会覆盖用户 1 的更改,那么在保存时传递“*”,当 ETag 不匹配时,Azure 不会给出错误。
ETag 属性是实体的时间戳。您可以在 ReadingEntity 事件中读取 ETag 属性。
void OnContextReadingEntity(object sender, ReadingWritingEntityEventArgs e)
{
string eTag = e.Data.FirstAttribute.Value;
}
有关更多详细信息,请参阅以下线程的讨论如何使用 Windows Azure 表存储时间戳或 Etag 字段