6

我正在从表中查询实体,更改它们,然后执行替换操作。替换操作失败,因为 etag 上的 etag 属性为空。我检查了一下,当我从 CreateQuery() 调用中获取实体时,etag 为空,但在我执行 Retrieve() 时填充。有没有办法手动获取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
4

2 回答 2

2

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

所以..

cloudTableClient.GetTableReference(TableName).CreateQuery() 而不是 serviceContext.CreateQuery..‏</p>

顺便说一句,我认为 TableQuery 在 2.1 中是新的......

于 2014-01-15T10:57:49.413 回答
1

问题源于您混合了两种不同的成分。

serviceContext.CreateQuery<MyEntity>(tableName)

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

MyCloudTableClient.GetTableReference(tableName).Execute(replaceOperation)

正在使用 Table.DataServices 命名空间。在此模型中,没有中心上下文,每个实体通过公开 Etag 属性来跟踪自己的状态。这是通过 ITableEntity 接口强制执行的。您在查询中使用的实体不打算与较新的库一起使用,这是问题的根源。

切换到使用

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

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

于 2014-01-23T09:27:39.237 回答