Упражнение. Создание элементов
Напомним, что вы можете создавать элементы в контейнере с помощью пакета SDK Azure Cosmos DB для .NET. Для этого проекта контейнер продуктов содержит как отдельные элементы продукта , так и специальные элементы категории для каждой категории. В этом приложении вам потребуется обработать два варианта:
- Если категория пустая, просто создайте элемент этой категории отдельно. Нет связанных элементов продукта для создания.
- Если категория содержит связанные продукты, необходимо создать элемент категории и связанные элементы продукта одновременно.
Сейчас у вас есть два основных требования:
- Создать элемент отдельно в рамках одной операции.
- Создать несколько связанных элементов с помощью транзакционного пакета.
После выполнения этого упражнения проект будет иметь логику создания элементов в контейнере по отдельности или в виде пакета.
Добавление отдельного элемента в контейнер
В Azure Cosmos DB можно создавать, заменять или добавлять элементы в контейнер. Для создания элемента требуется, чтобы у элемента был уникальный идентификатор. При замене элемента требуется, чтобы элемент уже существует. Upsert является лучшим из обоих миров, где он проверяет уникальный идентификатор, а затем заменяет или создает элемент. Для этого проекта вы хотите иметь возможность запускать приложение несколько раз без ошибок, что делает выбор четким. Для первого элемента мы создадим категорию, которая не имеет связанных продуктов. Здесь вы реализуете одну операцию upsert с созданной вручную категорией.
Снова откройте файл Program.cs.
Создайте экземпляр Category под названием
goggles
с указанными ниже значениями:Свойство Значение id ef7fa0f1-0e9d-4435-aaaf-a778179a94ad
categoryId gear-snow-goggles
Category goggles = new( Id: "ef7fa0f1-0e9d-4435-aaaf-a778179a94ad", CategoryId: "gear-snow-goggles" );
Создайте экземпляр PartitionKey, используя то же значение, что и для свойства
categoryId
для созданного ранее экземпляра Category.PartitionKey gogglesKey = new("gear-snow-goggles");
Используйте метод UpsertItemAsync для создания или замены элемента, передав объект для создаваемого элемента и значение ключа секции.
Category result = await container.UpsertItemAsync(goggles, gogglesKey);
Вывод различных свойств
result
в окно консоли, включая уникальный идентификатор элемента и тип элемента.Console.WriteLine($"[New item created]:\t{result.Id}\t(Type: {result.Type})");
Создайте экземпляр Category под названием
helmets
с указанными ниже значениями:Свойство Значение id 91f79374-8611-4505-9c28-3bbbf1aa7df7
categoryId gear-climb-helmets
Category helmets = new( Id: "91f79374-8611-4505-9c28-3bbbf1aa7df7", CategoryId: "gear-climb-helmets" );
Создайте экземпляр PartitionKey, используя то же значение, что и для свойства
categoryId
для созданного ранее экземпляра Category.PartitionKey helmetsKey = new("gear-climb-helmets");
Используйте метод UpsertItemAsync для создания или замены элемента, передавая объект для создаваемого элемента и значение ключа секции. Возвратите объект типа ItemResponse<T>.
ItemResponse<Category> response = await container.UpsertItemAsync(helmets, helmetsKey);
Печать различных свойств
response
консоли, включая уникальный идентификатор базового элемента, тип базового элемента и плату за запрос в секунду.Console.WriteLine($"[New item created]:\t{response.Resource.Id}\t(Type: {response.Resource.Type})\t(RUs: {response.RequestCharge})");
Сохраните файл Program.cs.
Реализация нескольких операций в виде транзакционного пакета
Теперь рассмотрим сценарий, в котором необходимо создать несколько продуктов вместе с категорией. Если продукты созданы, но категории нет, то эти продукты не так полезны. Создание нескольких элементов — это ситуация, когда можно использовать транзакцию для группировки нескольких операций "точка" вместе, чтобы все они были успешными или завершились сбоем как одна единица. Возвращаясь к нашему сценарию, нам нужно создать категорию для наружных палаток с несколькими продуктами (палатками). У нас уже есть один элемент категории без каких-либо элементов продукта. Вот что должно быть в итоге:
В этом разделе мы создадим пакет транзакций для создания tents
категории и связанных продуктов вместе.
В Program.cs создайте новый экземпляр
tents
категории с указанными ниже значениями:Свойство Значение id 5df21ec5-813c-423e-9ee9-1a2aaead0be4
categoryId gear-camp-tents
Category tents = new( Id: "5df21ec5-813c-423e-9ee9-1a2aaead0be4", CategoryId: "gear-camp-tents" );
Создайте четыре экземпляра типа Product с помощью этих значений.
Свойство cirroa
kuloar
mammatin
nimbolo
Id e8dddee4-9f43-4d15-9b08-0d7f36adcac8
e6f87b8d-8cd7-4ade-a005-14d3e2fbd1aa
f7653468-c4b8-47c9-97ff-451ee55f4fd5
6e3b7275-57d4-4418-914d-14d1baca0979
CategoryId gear-camp-tents
gear-camp-tents
gear-camp-tents
gear-camp-tents
Имя Cirroa Tent
Kuloar Tent
Mammatin Tent
Nimbolo Tent
Цена 490.00
530.00
0.00
330.00
Archived false
false
true
false
Количество 15
8
0
35
Product cirroa = new( Id: "e8dddee4-9f43-4d15-9b08-0d7f36adcac8", CategoryId: "gear-camp-tents" ){ Name = "Cirroa Tent", Price = 490.00m, Archived = false, Quantity = 15 };
Product kuloar = new( Id: "e6f87b8d-8cd7-4ade-a005-14d3e2fbd1aa", CategoryId: "gear-camp-tents" ){ Name = "Kuloar Tent", Price = 530.00m, Archived = false, Quantity = 8 };
Product mammatin = new( Id: "f7653468-c4b8-47c9-97ff-451ee55f4fd5", CategoryId: "gear-camp-tents" ){ Name = "Mammatin Tent", Price = 0.00m, Archived = true, Quantity = 0 };
Product nimbolo = new( Id: "6e3b7275-57d4-4418-914d-14d1baca0979", CategoryId: "gear-camp-tents" ){ Name = "Nimbolo Tent", Price = 330.00m, Archived = false, Quantity = 35 };
Теперь создайте экземпляр PartitionKey, используя значение
gear-camp-tents
.PartitionKey tentsKey = new("gear-camp-tents");
Создайте транзакционный пакет, ограниченный значением ключа секции
gear-camp-tents
, с помощью CreateTransactionalBatch(PartitionKey) метода. Используя синтаксис Fluent, добавьте пять операций upsert для создания элементов, необходимых в нашем контейнере для категории и всех связанных продуктов.TransactionalBatch batch = container.CreateTransactionalBatch(tentsKey) .UpsertItem<Category>(tents) .UpsertItem<Product>(cirroa) .UpsertItem<Product>(kuloar) .UpsertItem<Product>(mammatin) .UpsertItem<Product>(nimbolo);
Выведите сообщение в окно консоли, чтобы указать, что мы запускаем пакетную операцию.
Console.WriteLine("[Batch started]");
Используйте метод
TransactionalBatch.ExecuteAsync
для выполнения пакета и возврата специального типа ответа.using TransactionalBatchResponse batchResponse = await batch.ExecuteAsync();
Используя цикл for, выполните итерацию по всем элементам в ответе. Сначала преобразуйте каждый элемент в тип
TransactionalBatchOperationResult
, используя базовый классItem
в качестве универсального. Затем выведите уникальный идентификатор и тип объекта ответа.for (int i = 0; i < batchResponse.Count; i++) { TransactionalBatchOperationResult<Item> batchResult = batchResponse.GetOperationResultAtIndex<Item>(i); Console.WriteLine($"[New item created]:\t{batchResult.Resource.Id}\t(Type: {batchResult.Resource.Type})"); }
Выводит другое сообщение в окно консоли, указывающее, что пакет завершен. Включите плату за запрос для всего пакета в этом сообщении.
Console.WriteLine($"[Batch completed]:\t(RUs: {batchResponse.RequestCharge})");
Сохраните файл Program.cs.
Проверьте свою работу
Теперь приложение создает несколько элементов и обеспечивает достаточную устойчивость для многократного запуска без исключения. Здесь вы запустите приложение и проверьте выходные данные для уникальных идентификаторов каждого из шести только что созданных элементов.
Запустите приложение .NET в терминале:
dotnet run
Просмотрите выходные данные запуска приложения. Выходные данные должны соответствовать примеру:
... [New item created]: ef7fa0f1-0e9d-4435-aaaf-a778179a94ad (Type: Category) [New item created]: 91f79374-8611-4505-9c28-3bbbf1aa7df7 (Type: Category) (RUs: 10.29) [Batch started] [New item created]: 5df21ec5-813c-423e-9ee9-1a2aaead0be4 (Type: Category) [New item created]: e8dddee4-9f43-4d15-9b08-0d7f36adcac8 (Type: Product) [New item created]: e6f87b8d-8cd7-4ade-a005-14d3e2fbd1aa (Type: Product) [New item created]: f7653468-c4b8-47c9-97ff-451ee55f4fd5 (Type: Product) [New item created]: 6e3b7275-57d4-4418-914d-14d1baca0979 (Type: Product) [Batch completed]: (RUs: 36.76)
Совет
ЕЗ в этом примере выходных данных могут отличаться от тех, которые в ваших выходных данных.