无法在CreateQuery上获得Azure TableEntity etag

时间:2013-04-18 02:08:43

标签: azure azure-table-storage

我正在查询表中的实体,更改它们,然后执行替换操作。 替换操作失败,因为etag上的etag属性为null。我检查过,当我从CreateQuery()调用中获取实体时etag为null,但是当我执行Retrieve()时填充etag。有没有办法手动获取etag?

IEnumerable<MyEntity> query = from e in serviceContext.CreateQuery<MyEntity>(tableName)
                                        where e.Id == queryId
                                        select e;

MyEntity entity = query.FirstOrDefault();

// Update the MyEntity object

var replaceOperation = TableOperation.Replace(entity);
MyCloudTableClient.GetTableReference(tableName).Execute(replaceOperation);

// Exception is thrown here that eTag value is null

2 个答案:

答案 0 :(得分:2)

您是否尝试过使用TableQuery而不是DataServiceQuery?

所以..

cloudTableClient.GetTableReference(表名).CreateQuery() 而不是serviceContext.CreateQuery ..

btw TableQuery是2.1中的新功能我认为...

答案 1 :(得分:0)

问题源于您混合两种不同的组件。

serviceContext.CreateQuery<MyEntity>(tableName)

正在使用System.Data.Services.Client命名空间。在此模型中,实体本身不跟踪etag,上下文为您执行此操作。

MyCloudTableClient.GetTableReference(tableName).Execute(replaceOperation)

正在使用Table.DataServices名称空间。在此模型中,没有中央上下文,每个实体通过公开Etag属性来跟踪其自己的状态。这是通过ITableEntity界面强制执行的。您从查询中使用的实体不适用于较新的库,这是问题的根源。

切换到使用

MyCloudTableClient.GetTableReference(tableName).CreateQuery<MyEntity>()

创建您的查询,您的问题应该消失。