1

asure sdk 1.6 (스토리지 에뮬레이터에 대한)의 새로운 upsert 기능을 사용하려고합니다.Azure 테이블 스토리지 sdk 1.6 Upsert 삽입하지 않음

그러나 나는 그저 업데이트 작업 만 할 수있었습니다. 내가 새 rowkey를 오순절하려고 노력할 때 나는 resource not found 예외를 얻는다. 내가 AddObject을 넣으면

var context = new TableServiceContext(_cloudStorageAccount.TableEndpoint.ToString(), _cloudStorageAccount.Credentials) 
      { 
       MergeOption = MergeOption.NoTracking, 
       ResolveType = (unused) => typeof(SmartTableServiceEntity) 
      }; 
context.AttachTo(tableName, smartEntity, "*"); 
      context.UpdateObject(smartEntity); 
      context.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate); 

그것은 삽입하지만 업데이트를 수행합니다. 새 SDK 덕분에 한 가지 작업으로 두 가지 작업을 모두 수행 할 수 있다고 생각했습니다.

답변

3

내가 devstorage에 실제 스토리지의 작품에 보이는 솔루션을이 온

var context = CreateNewContext(); 

      context.IgnoreResourceNotFoundException = true; 

      if (context.StorageCredentials.AccountName == "devstoreaccount1") 
      { 
       var entityCheck = context.CreateQuery<SmartTableServiceEntity>(tableName) 
        .Where(e => e.PartitionKey == partitionKey && e.RowKey == rowKey).FirstOrDefault(); 

       if (entityCheck == null) { 
        context.AddObject(tableName, smartEntity); 
       } 
       else { 
        context.Detach(entityCheck); 
        context.AttachTo(tableName, smartEntity, "*"); 
        context.UpdateObject(smartEntity); 
       } 
      } 
      else 
      { 
       context.AttachTo(tableName, smartEntity, null); 
       context.UpdateObject(smartEntity); 
      } 
      context.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate); 

사람이 더 나은 솔루션을 제공합니까? 차이점이 "*"인지 확인하고 null입니까?

+0

다음과 같은 두 가지 이유 때문에 로컬 저장소의 제한 사항을 해결할 필요가 없습니다. (1) 월간 저장 용량은 GB 당 0.14 달러이고 10,000 개 저장소 트랜잭션 당 $ 0.01입니다. 즉, 실제 Azure 계정을 사용합니다. (2) Windows Azure Tools/SDK의 다음 릴리스는 로컬 저장소 에뮬레이터에 대한 기능을 제공 할 것입니다. – astaykov

+0

예, 실제로 그럴 수 있습니다. 고맙습니다 :) –

7

실제 Azure 저장소에서만 작동합니다. 개발 저장소는 업 서트 작업을 지원하지 않습니다. 또한 tableServiceContext의 IgnoreResourceNotFoundException 속성을 true로 설정해야합니다.

+0

감사합니다. –

+0

어딘가에 말하지 않을 것입니다.이 시간에 몇 시간을 보냈습니다. – AdamC

+0

그것은 여기에있다 :) 구석에있는 새로운 SDK가이 문제를 해결할 수 있지만, 나는 100 % 확실하다. – astaykov

0

진짜 푸른 계정을 사용뿐만 아니라 true로 IgnoreResourceNotFoundException를 설정, ETAG 매개 변수에 null을 전달하거나 ETAG을 허용하지 않는 오버로드를 사용하는 것도 중요하다 사전으로 감사합니다 값. 그렇지 않으면 ResourceNotFound 예외가 발생합니다.

관련 문제