Как избежать нового упадка в хранилище таблиц Azure - PullRequest
2 голосов
/ 19 октября 2011

Стив Маркс пишет о новых методах расширения для выполнения загрузок в хранилище таблиц 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 Ответ

5 голосов
/ 19 октября 2011

Просто используйте 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");
    }
}
...