2013-04-18 14 views
6

Tôi đang thực hiện truy vấn cho các thực thể từ một bảng, thay đổi chúng, sau đó thực hiện một thao tác thay thế. Thao tác thay thế không thành công vì thuộc tính etag trên etag là null. Tôi đã kiểm tra, và etag là null khi tôi nhận được thực thể từ một cuộc gọi CreateQuery(), nhưng được điền khi tôi làm Retrieve(). Có cách nào để lấy etag bằng tay không?Không thể nhận được Azure TableEntity etag trên CreateQuery

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

Bạn đã xem xét việc chỉ đặt ETAG của thực thể thành "*" (dấu hoa thị) trước khi gọi Thay thế? Trừ khi bạn có yêu cầu cụ thể mà bạn chưa đề cập, thì bạn chỉ có thể yêu cầu hoạt động của bảng bỏ qua ETag bằng cách đặt nó thành dấu hoa thị. – Nathan

Trả lời

1

Các vấn đề xuất phát từ thực tế là bạn đang trộn hai thành phần khác nhau.

serviceContext.CreateQuery<MyEntity>(tableName) 

đang sử dụng không gian tên System.Data.Services.Client. Trong mô hình này bản thân thực thể không theo dõi etag, bối cảnh thực hiện điều này cho bạn.

MyCloudTableClient.GetTableReference(tableName).Execute(replaceOperation) 

Đang sử dụng không gian tên Table.DataServices. Trong mô hình này không có bối cảnh trung tâm và mỗi thực thể theo dõi trạng thái riêng của nó bằng cách trưng ra một thuộc tính Etag. Điều này được thực thi thông qua giao diện ITableEntity. Thực thể bạn đang sử dụng từ truy vấn không có ý định được sử dụng với các thư viện mới hơn, và đây là gốc của vấn đề.

chuyển sang sử dụng

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

để tạo truy vấn của bạn và các vấn đề của bạn sẽ biến mất.

2

bạn đã thử sử dụng TableQuery thay vì DataServiceQuery chưa?

Vì vậy ..

cloudTableClient.GetTableReference (TableName) .CreateQuery() thay vì serviceContext.CreateQuery ..

btw TableQuery là mới trong 2.1 Tôi nghĩ ...

Các vấn đề liên quan