Хранилище таблиц Azure: добавление элемента, если он не существует

#c# #azure #azure-table-storage

#c# #azure #azure-table-storage

Вопрос:

Я использую хранилище таблиц Azure и использую объект CloudTable (в библиотеке Microsoft Microsoft.Azure.Космос.Таблица) для добавления записи. На данный момент у меня есть это:

Учитывая, что мой объект CloudTable это: private readonly CloudTable cloudTable;

У меня есть следующий код для обновления записи:

 var upsertOp = TableOperation.InsertOrReplace(myRecord);
cloudTable.ExecuteAsync(upsertOp);
 

Однако то, что я хочу сделать, это добавить новую запись, только если запись еще не существует. Если он уже существует, я не хочу добавлять или обновлять существующий.

Каков правильный подход к этому? Должен ли я каким-либо образом использовать транзакции или я могу использовать tableоперацию.Метод Insert() (я предполагаю, что это вызовет исключение, если элемент уже существует)?

Ответ №1:

Нет прямого способа проверить, находится ли запись в хранилище таблиц Azure или нет.

Итак, вот 2 способа сделать это:

1.As вы упомянули, что вы можете напрямую использовать TableOperation.Insert() метод с помощью try-catch. Если запись уже существует, она выдаст ошибку:

    try
    {
        var op1 = TableOperation.Insert(c1);
        table.Execute(op1);
    }
    catch (Exception ex)
    {
        //if the record already exists, an error will be thrown.

    }
 

2. Вы также можете использовать этот TableOperation.Retrieve() метод. Если запись не возвращается, вы можете вставить новую. В противном случае вам не нужно вставлять новый элемент:

         TableOperation retrieveOperation = TableOperation.Retrieve<CustomerEntity>("partition_key", "row_key");
        TableResult result = table.Execute(retrieveOperation);

        CustomerEntity customer = result.Result as CustomerEntity;
        if (customer != null)
        {
            //if it's not null, you don't need to insert a new record.
        }
        else
        {
            //if it's null, you can insert a new record.
        }
 

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

1. Не может ли быть условие гонки, если есть несколько запросов. Состояние может измениться между извлечением и вставкой?

2. @millie Для нескольких запросов, да, у него есть проблема. Поэтому я предлагаю вам использовать этот Insert метод напрямую try-catch . И вот также статья, управляющая параллелизмом в хранилище Microsoft Azure , для вашей справки.

3. и если ответ полезен, не могли бы вы принять его в качестве ответа? Спасибо.