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?
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! –
Expliquez-en plus sur le ralentissement (peut-être une nouvelle question). Je ne vois pas pourquoi accrocher cet événement affecterait la performance. – smarx