2013-04-18 14 views
6

Wykonuję zapytanie dotyczące elementów z tabeli, zmieniając je, a następnie wykonując operację zamiany. Operacja replace nie powiedzie się, ponieważ właściwość etag w etagu ma wartość null. Sprawdziłem i etag ma wartość null, gdy otrzymam obiekt z wywołania CreateQuery(), ale zapełnione, gdy wykonuję funkcję Retrieve(). Czy istnieje sposób, aby ręcznie pobrać etag?Nie można pobrać obiektu Azure TableEntity etag w narzędziu 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

Czy rozważałeś po prostu ustawienie ETag obiektu na "*" (gwiazdkę) przed wywołaniem Zastąp? Jeśli nie masz konkretnych wymagań, o których nie wspomniałeś, możesz po prostu powiedzieć operacji w tabeli, aby zignorować ETag, ustawiając ją w gwiazdkę. – Nathan

Odpowiedz

1

The problem wynika z faktu mieszania dwóch różnych składników.

serviceContext.CreateQuery<MyEntity>(tableName) 

korzysta z przestrzeni nazw System.Data.Services.Client. W tym modelu jednostka sama nie śledzi etag, kontekst robi to za Ciebie.

MyCloudTableClient.GetTableReference(tableName).Execute(replaceOperation) 

Korzysta z przestrzeni nazw Table.DataServices. W tym modelu nie ma centralnego kontekstu i każda jednostka śledzi swój własny stan poprzez ujawnienie właściwości Etag. Jest to egzekwowane za pośrednictwem interfejsu ITableEntity. Podmiot, którego używasz z kwerendy, nie jest przeznaczony do użycia z nowszymi bibliotekami, a to jest źródłem problemu.

Przełącz do korzystania

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

stworzyć zapytanie i twoje problemy powinny zniknąć.

2

Czy próbowałeś używać TableQuery zamiast DataServiceQuery?

Więc ..

cloudTableClient.GetTableReference (TableName) .CreateQuery() zamiast serviceContext.CreateQuery ..

btw TableQuery nowego w 2.1 myślę ...

Powiązane problemy