Azure表存储sdk 1.6 Upsert不插入

时间:2011-12-21 09:48:17

标签: c# azure azure-storage azure-table-storage azure-sdk-.net

我正在尝试使用asure sdk 1.6的新upsert功能(针对存储模拟器)。

但我只是设法让更新正常运行。当我尝试使用新的rowkey upit时,我得到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 个答案:

答案 0 :(得分:7)

它只能用于真正的Azure存储。开发存储不支持Upsert操作。 您还必须将tableServiceContext的IgnoreResourceNotFoundException属性设置为true。

答案 1 :(得分: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之间的区别是否正常?

提前谢谢

答案 2 :(得分:0)

使用真正的Azure帐户时,以及将IgnoreResourceNotFoundException设置为true,为eTag参数传递null或使用不接受eTag值的重载也很重要。否则,您将获得ResourceNotFound异常。