#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. и если ответ полезен, не могли бы вы принять его в качестве ответа? Спасибо.