gpt4 book ai didi

c# - 避免在 Azure 表存储中进行新的更新插入

转载 作者:行者123 更新时间:2023-12-02 23:14:27 25 4
gpt4 key购买 nike

Steve Marx 在此处撰写了有关在 Azure 表存储中执行更新插入的新扩展方法的文章,作为新存储协议(protocol)版本的一部分:

http://blog.smarx.com/posts/extension-methods-for-the-august-storage-features

但是,如果我想要执行无条件合并或抛出的原始操作,而不是更新插入,该怎么办?我想合并一个对象,更新单个字段,但如果该实体不存在,则抛出异常,而不是创建一个仅包含我要合并的属性的新实体。

这可能吗?请注意,我想在其他地方使用 upsert,因此我开始让 IoC 为我提供从 GetDataServiceContext2011 而不是 GetDataServiceContext 创建的上下文。我想我可以在两者之间交替使用,但是当 Azure 团队更新官方库时,这将无济于事。

根据MSDN :

The Insert Or Merge Entity operation uses the MERGE verb and must be called using the 2011-08-18 version or newer. In addition, it does not use the If-Match header. These attributes distinguish this operation from the Update Entity operation, though the request body is the same for both operations.

那么,如何让存储库在保存时发出通配符 If-Match 而不是根本不发出 If-Match

最佳答案

只需使用带有星号的 AttachTo 来表示 etag。这将产生 If-Match: *。这是一个完整的工作示例:

class Entity : TableServiceEntity
{
public string Text { get; set; }
public Entity() { }
public Entity(string rowkey) : base(string.Empty, rowkey) { }
}
class Program
{
static void Update(CloudStorageAccount account)
{
var ctx = account.CreateCloudTableClient().GetDataServiceContext();

var entity = new Entity("foo") { Text = "bar" };
ctx.AttachTo("testtable", entity, "*");
ctx.UpdateObject(entity);
ctx.SaveChangesWithRetries();
}

static void Main(string[] args)
{
var account = CloudStorageAccount.Parse(args[0]);
var tables = account.CreateCloudTableClient();
tables.CreateTableIfNotExist("testtable");
var ctx = tables.GetDataServiceContext();

try { Update(account); } catch (Exception e) { Console.WriteLine("Exception (as expected): " + e.Message); }

ctx.AddObject("testtable", new Entity("foo") { Text = "foo" });
ctx.SaveChangesWithRetries();

try { Update(account); } catch (Exception e) { Console.WriteLine("Unexpected exception: " + e.Message); }

Console.WriteLine("Now text is: " + tables.GetDataServiceContext().CreateQuery<Entity>("testtable").Where(e => e.PartitionKey == string.Empty && e.RowKey == "foo").Single().Text);
tables.DeleteTableIfExist("testtable");
}
}

关于c# - 避免在 Azure 表存储中进行新的更新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7821140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com