Хранилище таблиц Azure InsertOrMerge - PullRequest
0 голосов
/ 26 июня 2018

У меня есть хранилище таблиц Azure, которое содержит некоторые данные.Мне нужно обновить одно свойство для всех записей в таблице.Я знаю ключ раздела и ключ строки для каждого элемента.Однако может быть так, что у меня есть новые элементы в моем CSV-файле.

Что мне нужно сделать, это:

  • , если элемент найден в хранилище таблицы на основе ParitionKey и RowKeyЯ хочу обновить одно свойство: Имя.
  • , если элемент не найден в таблице, его необходимо вставить, но у меня есть дополнительные свойства, которые необходимо заполнить: Имя, Электронная почта, Адрес

Я пытаюсь использовать InsertOrMerge, но я получил исключение Etag и как я могу настроить дополнительные свойства, если элемент не найден и потребуется вставка?

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

        CloudTableClient cloudTableClient = storageAccount.CreateCloudTableClient();

        CloudTable ct = cloudTableClient.GetTableReference("mytable");



             var item = new Item()
             {
                 PartitionKey = "PARTITIONID",
                 RowKey = "ROWID",                
                 Name = "DEMO",                     
             };

        TableOperation to = TableOperation.Merge(code);

        var result = await ct.ExecuteAsync(to);

1 Ответ

0 голосов
/ 26 июня 2018

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

System.ArgumentException: 'Merge requires an ETag (which may be the '*' wildcard).'

Ваше требование может быть достигнуто с помощью Retrieve и InsertOrMerge.

Добавьте два свойства Email и Address к вашему Item классу.

 public class Item: TableEntity
 {
    public Item(String PartitionKey, String RowKey, String Name, String Email=null, String Address=null)
    {
        this.RowKey = RowKey ;
        this.PartitionKey = PartitionKey;
        this.Name = Name;
        this.Email = Email;
        this.Address = Address;
    }

    public Item(){}

    public String Name { get; set; }

    public String Email { get; set; }

    public String Address { get; set; }

}

Добавьте переключатель, чтобы указать, какие свойства загружать.

 TableOperation to = TableOperation.Retrieve<Item>("PK","RK");

 TableResult tr = table.ExecuteAync(to).Result;

 var item;

 if (tr != null)
 {
     item = new Item
     {
         PartitionKey = "PARTITIONID",
         RowKey = "ROWID",                
         Name = "DEMO",  
     }
 }
 else
 {
     item = new Item
     {
         PartitionKey = "PARTITIONID",
         RowKey = "ROWID",                
         Name = "DEMO",  
         Email = "test@example.com",
         Address = "Britain"
     }
 }

 to = TableOperation.InsertOrMerge(item);

 tr = await ct.ExecuteAysnc(to).Result;

.Когда вы выполняете InsertOrMerge,

  • Если элемент существует, его содержимое (Имя) будет обновляться вашим новым элементом.
  • Если он не существует, он будетвставлено как положено.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...