2011-10-22 1 views
4

Nous avons une solution où nous parallélisons la lecture et l'écriture à Azure Table Storge. Parce que TableServiceContext ne prend pas en charge la lecture d'une entité sur un thread et l'enregistrement sur un autre thread, nous souhaitons conserver l'entité à l'aide d'un autre contexte.Comment obtenons-nous ETag d'une entité de stockage Azure Table qui n'est pas suivie?

Pour ce faire, nous devons définir:

context.MergeOption = MergeOption.NoTracking; 

Et quand la mise à jour (ou la suppression) une entité que nous appelons:

context.AttachTo(entitySetName, entity, eTag); 

Cependant, pour ce faire, nous devons connaître le ETag, et je ne savoir comment l'obtenir.

Si l'entité a été suivi, nous pourrions utiliser le EntityDesciptor.ETag comme ceci:

private string GetETagFromEntity<T>(T entity) where T : TableServiceEntity 
{ 
    return context.Entities.Single(entityDescriptor => 
            entityDescriptor.Entity == entity).ETag; 
} 

... mais context.Entities sont vides parce que nous ne surveillons pas les entités.

La seule solution que nous avons trouvé ainsi le prix est:

context.AttachTo(entitySetName, entity, "*"); 

... mais cela signifie que nous avons des problèmes de concurrence où le dernier à écrire gagne toujours.

Nous avons essayé aussi de construire les éléments suivants qui fonctionne sur Emulator local Compute, mais pas dans le nuage:

private string GetETagFromEntity<T>(T entity) where T : TableServiceEntity 
{ 
    string datePart = entity.Timestamp.ToString("yyyy-MM-dd"); 
    string hourPart = entity.Timestamp.ToString("HH"); 
    string minutePart = entity.Timestamp.ToString("mm"); 
    string secondPart = entity.Timestamp.ToString("ss"); 
    string milisecondPart = entity.Timestamp.ToString("fff").TrimEnd('0'); 

    return string.Format(
       "W/\"datetime'{0}T{1}%3A{2}%3A{3}.{4}Z'\"", 
       datePart, 
       hourPart, 
       minutePart, 
       secondPart, 
       milisecondPart 
      ).Replace(".Z", "Z"); 
} 

Le problème général avec cette approche, même si nous pouvions le faire fonctionner, est que Microsoft ne faites des garanties sur l'apparence de l'ETag, cela pourrait donc changer avec le temps. Donc la question est: Comment obtenons-nous ETag d'une Entité de stockage de Table Azure qui n'est pas suivie?

Répondre

2

Je pense que vous devrez noter l'etag lorsque vous lisez l'entité. (Il y a probablement un événement que vous pouvez accrocher, peut-être ReadingEntity où vous pouvez accéder à l'etag et le stocker quelque part.)

+0

Merci ... J'ai marqué cela comme la bonne réponse. Vous pouvez obtenir l'ETAG sur l'événement ReadingEntity avec le follwoing (laid) Code: vide OnContextReadingEntity (expéditeur d'objet, ReadingWritingEntityEventArgs e) { chaîne eTag = e.Data.FirstAttribute.Value; } C'est très très lent. Une opération que j'avais prise quelques secondes maintenant prend 2 minutes! –

+0

Expliquez-en plus sur le ralentissement (peut-être une nouvelle question). Je ne vois pas pourquoi accrocher cet événement affecterait la performance. – smarx

0

J'ai écrit un autre client de stockage de table qui est très explicite en exposant l'etag et peut être utilisé sans contexte et est thread safe. Il peut travailler pour vous. Il est disponible sur www.lucifure.com.

Questions connexes