2013-04-18 23 views
6

我正在查詢表中的實體,更改它們,然後執行替換操作。 替換操作失敗,因爲etag上的etag屬性爲空。我檢查了,當我從CreateQuery()調用中獲得實體時,etag爲空,但當我執行Retrieve()時,它填充了。有沒有辦法手動獲取etag?無法在CreateQuery上獲取Azure TableEntity 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 
+1

在調用Replace之前,您是否考慮過將實體的ETag設置爲「*」(星號)?除非您有沒有提及的具體要求,否則您可以通過將表格操作設置爲星號來忽略該ETag。 – Nathan 2013-04-18 21:05:48

回答

1

的問題源於您混合兩個不同組件的事實。

serviceContext.CreateQuery<MyEntity>(tableName) 

正在使用System.Data.Services.Client命名空間。在這個模型中,實體本身不跟蹤etag,上下文爲你做這件事。

MyCloudTableClient.GetTableReference(tableName).Execute(replaceOperation) 

使用Table.DataServices命名空間。在這個模型中沒有中心環境,每個實體通過暴露Etag屬性來跟蹤自己的狀態。這是通過ITableEntity接口強制執行的。您在查詢中使用的實體不適用於較新的庫,這是問題的根源。

切換到使用

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

創建您的查詢,您的問題就會消失。

2

你試過使用TableQuery而不是DataServiceQuery嗎?

所以..

cloudTableClient.GetTableReference(表名).CreateQuery() 代替serviceContext.CreateQuery ..

BTW TableQuery在2.1,我認爲是新的......