우리는 Azure Table Storge에 읽기 및 쓰기를 병렬 처리하는 솔루션을 제공합니다.추적되지 않은 Azure 테이블 저장소 엔터티의 ETag를 얻는 방법은 무엇입니까?
TableServiceContext는 한 스레드에서 엔티티를 읽고 다른 스레드에 저장하는 것을 지원하지 않기 때문에 다른 Context를 사용하여 엔티티를 유지하려고합니다.
context.MergeOption = MergeOption.NoTracking;
을 그리고 엔티티를 업데이트 (또는 제거) 할 때 우리가 전화 : 그러나
context.AttachTo(entitySetName, entity, eTag);
우리가있는 ETag를 알 필요가 그렇게하고, 그렇게하지 우리가 설정해야 할 것을해야 할 일 그것을 얻는 방법을 아십시오.
private string GetETagFromEntity<T>(T entity) where T : TableServiceEntity
{
return context.Entities.Single(entityDescriptor =>
entityDescriptor.Entity == entity).ETag;
}
을 ...하지만 우리가 실체를 추적하지 않기 때문에 context.Entities 비어 있습니다 : 엔티티 추적 경우
, 우리는이 같은 EntityDesciptor.ETag를 사용할 수 있습니다.
context.AttachTo(entitySetName, entity, "*");
...하지만 마지막 승리 항상 쓰기 위치를 우리가 동시성 문제가 의미
우리가 발견 한 유일한 해결책은 그래서 요금입니다.
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");
}
우리가 얻을 작동 할 수있는 경우에도이 방식의 일반적인 문제는, 마이크로 소프트가 없다는 것입니다 :
우리는하지만 클라우드 로컬 계산 에뮬레이터에서 작동 다음을 구성하려 ETag가 어떻게 보이는지에 관해서는 어떤 보증도하지 마십시오. 그래서 이것은 시간이 지남에 따라 변할 수 있습니다.그래서 질문입니다 : 추적되지 않은 Azure 테이블 저장소 엔터티의 ETag를 얻으려면 어떻게해야합니까?
감사 ...이 답변을 정답으로 표시했습니다. 당신은 때라도 (추한) 코드 ReadingEntity 이벤트에 ETAG 얻을 수 있습니다 : 무효 OnContextReadingEntity (개체를 보낸 사람, ReadingWritingEntityEventArgs 전자) { 문자열 ETAG = e.Data.FirstAttribute.Value을; } 매우 느립니다. 몇 초 걸리던 작업이 2 분이 소요됩니다! –
감속 (아마도 새로운 질문)에 대해 더 자세히 설명하십시오. 왜이 이벤트를 후킹하는 것이 성능에 영향을 미치는지 나는 알지 못합니다. – smarx