#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).