Как избежать нового повышения в табличном хранилище Azure

#c# #azure #upsert #azure-table-storage #azure-storage

#c# #azure #вставка upsert #azure-table-storage #azure-хранилище

Вопрос:

Стив Маркс пишет о новых методах расширения для выполнения повышений в хранилище таблиц Azure в рамках новой версии протокола хранения здесь:

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

Однако, что, если я хочу выполнить исходную операцию безусловного слияния или выброса, а не upsert . Я хочу объединить объект, обновив одно поле, но выбросить, если объект не существует, а не создавать новый объект, содержащий только свойства, которые я объединяю.

Возможно ли это? Обратите внимание, что я хочу использовать upsert в другом месте, поэтому я решил, что IoC предоставит мне контексты, созданные из GetDataServiceContext2011 вместо GetDataServiceContext . Я полагаю, я мог бы чередовать их, но это не поможет, когда команда Azure обновит официальные библиотеки.

Согласно MSDN:

Операция вставки или слияния объектов использует глагол MERGE и должна вызываться с использованием версии 2011-08-18 или новее. Кроме того, он не использует заголовок If-Match. Эти атрибуты отличают эту операцию от операции обновления объекта, хотя тело запроса одинаково для обеих операций.

Итак, как мне заставить библиотеку хранилища выдавать подстановочный If-Match знак при сохранении, а не выдавать If-Match вообще?

Ответ №1:

Просто используйте 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 amp;amp; e.RowKey == "foo").Single().Text);
        tables.DeleteTableIfExist("testtable");
    }
}
  

Комментарии:

1. Спасибо. Я чувствую себя глупо на этом. 😛

2. @smarx что на самом деле делает etag? Я попытался найти это в Google, но не нашел никакого объяснения этому.

3. @starcom В этом случае сам вопрос дает ответ и предоставляет источник (MSDN).