2013-04-18 19 views
6

Sto eseguendo una query per entità da una tabella, modificandole, quindi eseguendo un'operazione di sostituzione. L'operazione di sostituzione non riesce perché la proprietà etag su etag è null. Ho controllato e l'etag è nullo quando ottengo l'entità da una chiamata CreateQuery(), ma popolata quando eseguo Recupera(). C'è un modo per ottenere manualmente l'etag?Impossibile ottenere Azure TableEntity etag su 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

Avete considerato di impostare l'ETag dell'entità su "*" (asterisco) prima di chiamare Sostituisci? A meno che tu non abbia requisiti specifici che non hai menzionato, puoi semplicemente dire all'operazione della tabella di ignorare l'ETag impostandolo su un asterisco. – Nathan

risposta

1

Il problema deriva dal fatto che si stanno mescolando due diversi componenti.

serviceContext.CreateQuery<MyEntity>(tableName) 

utilizza lo spazio dei nomi System.Data.Services.Client. In questo modello l'entità stessa non traccia l'etag, il contesto fa questo per te.

MyCloudTableClient.GetTableReference(tableName).Execute(replaceOperation) 

Sta utilizzando lo spazio dei nomi Table.DataServices. In questo modello non esiste un contesto centrale e ogni entità traccia il proprio stato esponendo una proprietà Etag. Questo è applicato tramite l'interfaccia ITableEntity. L'entità che stai utilizzando dalla query non è pensata per essere utilizzata con le nuove librerie e questa è la radice del problema.

Passaggio all'utilizzo

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

per creare la query e le vostre questioni dovrebbero andare via.

2

hai provato a utilizzare TableQuery anziché DataServiceQuery?

Quindi ..

cloudTableClient.GetTableReference (TableName) .CreateQuery() invece di serviceContext.CreateQuery ..

btw TableQuery è nuovo in 2.1 penso ...

Problemi correlati