Azure Table Storage sdk 1.6 Upsert не вставляется - PullRequest
1 голос
/ 21 декабря 2011

Я пытаюсь использовать новую функцию upsert Asure SDK 1.6 (против эмулятора хранилища).

Но мне удалось заставить работать только обновление. Когда я пытаюсь сохранить новую строку, я получаю исключение resource not found.

 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);

Если я поставлю AddObject, это сделает вставку, но не обновление. Я думал, что смогу сделать оба в одном действии благодаря новому SDK.

Ответы [ 3 ]

7 голосов
/ 21 декабря 2011

это будет работать только против реального хранилища Azure.Разработка хранилища не поддерживает операцию Upsert.Также вы должны установить для свойства IgnoreResourceNotFoundException таблицы tableServiceContext значение true.

3 голосов
/ 21 декабря 2011

Я придумал это решение, которое работает на 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);

у кого-нибудь есть лучшее решение? обратите внимание на разницу между "*" и нулем, это нормально?

спасибо заранее

0 голосов
/ 23 января 2012

При использовании реальных учетных записей Azure, а также при установлении для IgnoreResourceNotFoundException значения true также важно передать значение null для параметра eTag или использовать перегрузку, которая не принимает значение eTag.В противном случае вы получите исключения ResourceNotFound.

...