C# Azure表存储sdk 1.6 Upsert未插入

C# Azure表存储sdk 1.6 Upsert未插入,c#,azure,azure-storage,azure-table-storage,azure-sdk-.net,C#,Azure,Azure Storage,Azure Table Storage,Azure Sdk .net,我正在尝试使用asure sdk 1.6的新upsert功能(针对存储模拟器) 但我只是设法让更新生效。当我尝试向上插入新的行键时,我得到未找到资源异常 var context = new TableServiceContext(_cloudStorageAccount.TableEndpoint.ToString(), _cloudStorageAccount.Credentials) { MergeOption = MergeOpti

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

但我只是设法让更新生效。当我尝试向上插入新的行键时,我得到
未找到资源
异常

 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,我一直在考虑能够在一次操作中同时完成这两项任务。

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

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

我提出了一个似乎适用于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);
var context=CreateNewContext();
context.IgnoreResourceNotFoundException=true;
if(context.StorageCredentials.AccountName==“devstoreaccount1”)
{
var entityCheck=context.CreateQuery(tableName)
。其中(e=>e.PartitionKey==PartitionKey&&e.RowKey==RowKey)。FirstOrDefault();
如果(entityCheck==null){
AddObject(tableName,smartEntity);
}
否则{
context.Detach(entityCheck);
context.AttachTo(tableName,smartEntity,“*”);
context.UpdateObject(智能体);
}
}
其他的
{
AttachTo(tableName,smartEntity,null);
context.UpdateObject(智能体);
}
SaveChangesWithRetries(SaveChangesOptions.replaceoupdate);
有人有更好的解决方案吗? 注意“*”和null之间的区别,可以吗


提前感谢您

我提出了这个解决方案,它似乎适用于devstorage和real storage

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);
var context=CreateNewContext();
context.IgnoreResourceNotFoundException=true;
if(context.StorageCredentials.AccountName==“devstoreaccount1”)
{
var entityCheck=context.CreateQuery(tableName)
。其中(e=>e.PartitionKey==PartitionKey&&e.RowKey==RowKey)。FirstOrDefault();
如果(entityCheck==null){
AddObject(tableName,smartEntity);
}
否则{
context.Detach(entityCheck);
context.AttachTo(tableName,smartEntity,“*”);
context.UpdateObject(智能体);
}
}
其他的
{
AttachTo(tableName,smartEntity,null);
context.UpdateObject(智能体);
}
SaveChangesWithRetries(SaveChangesOptions.replaceoupdate);
有人有更好的解决方案吗? 注意“*”和null之间的区别,可以吗


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

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

我不会费心解决本地存储的这一限制,原因有两个:(1)每月存储每GB 0.14美元,每10000个存储事务0.01美元(这意味着我将使用真正的Azure帐户);(2)最有可能的是,下一版本的Windows Azure Tools/SDK将为本地存储模拟器提供该功能。是的,这确实很合理。谢谢:)我不会费心解决本地存储的这一限制,原因有两个:(1)定价为每月存储每GB 0.14美元和每10000个存储事务0.01美元(这意味着我将使用一个真正的Azure帐户);以及(2)最有可能的是,下一版本的Windows Azure Tools/SDK将为本地存储模拟器提供该功能。是的,这确实是有道理的。谢谢:)这里说:)即将推出的新SDK可能会解决这个问题,但我100%肯定。FWIW也说了。如果有疑问,请始终返回核心REST API;C#SDK只是一个包装器。表服务API的文档不再提到这一点。事实上,在Azure Storage Emulator的4.0.0.0版本中,InsertOrReplace操作在大多数情况下都可以工作。它将与开发凭据和允许访问整个表的SAS凭据一起使用。但是,从今天的最新版本开始,如果您尝试使用指定最小和最大分区密钥的SAS凭据,它将继续返回404。资料来源:我生命的最后10个小时。这里说:)即将推出的新SDK可能会解决这个问题,但我100%肯定。FWIW也有人说。如果有疑问,请始终返回核心REST API;C#SDK只是一个包装器。表服务API的文档不再提到这一点。事实上,在Azure Storage Emulator的4.0.0.0版本中,InsertOrReplace操作在大多数情况下都可以工作。它将与开发凭据和允许访问整个表的SAS凭据一起使用。但是,从今天的最新版本开始,如果您尝试使用指定最小和最大分区密钥的SAS凭据,它将继续返回404。资料来源:我生命的最后10个小时。