我正在尝试使用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,我以为能够在一个动作中做到这两点。
答案 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异常。