Упражнение. Создание элементов

Завершено

Напомним, что вы можете создавать элементы в контейнере с помощью пакета SDK Azure Cosmos DB для .NET. Для этого проекта контейнер продуктов содержит как отдельные элементы продукта , так и специальные элементы категории для каждой категории. В этом приложении вам потребуется обработать два варианта:

  • Если категория пустая, просто создайте элемент этой категории отдельно. Нет связанных элементов продукта для создания.
  • Если категория содержит связанные продукты, необходимо создать элемент категории и связанные элементы продукта одновременно.

Сейчас у вас есть два основных требования:

  1. Создать элемент отдельно в рамках одной операции.
  2. Создать несколько связанных элементов с помощью транзакционного пакета.

Иллюстрация: значки, которые указывают, что данные передаются в облако.

После выполнения этого упражнения проект будет иметь логику создания элементов в контейнере по отдельности или в виде пакета.

Добавление отдельного элемента в контейнер

В Azure Cosmos DB можно создавать, заменять или добавлять элементы в контейнер. Для создания элемента требуется, чтобы у элемента был уникальный идентификатор. При замене элемента требуется, чтобы элемент уже существует. Upsert является лучшим из обоих миров, где он проверяет уникальный идентификатор, а затем заменяет или создает элемент. Для этого проекта вы хотите иметь возможность запускать приложение несколько раз без ошибок, что делает выбор четким. Для первого элемента мы создадим категорию, которая не имеет связанных продуктов. Здесь вы реализуете одну операцию upsert с созданной вручную категорией.

  1. Снова откройте файл Program.cs.

  2. Создайте экземпляр 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"
    );
    
  3. Создайте экземпляр PartitionKey, используя то же значение, что и для свойства categoryId для созданного ранее экземпляра Category.

    PartitionKey gogglesKey = new("gear-snow-goggles");
    
  4. Используйте метод UpsertItemAsync для создания или замены элемента, передав объект для создаваемого элемента и значение ключа секции.

    Category result = await container.UpsertItemAsync(goggles, gogglesKey);
    
  5. Вывод различных свойств result в окно консоли, включая уникальный идентификатор элемента и тип элемента.

    Console.WriteLine($"[New item created]:\t{result.Id}\t(Type: {result.Type})");
    
  6. Создайте экземпляр 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"
    );
    
  7. Создайте экземпляр PartitionKey, используя то же значение, что и для свойства categoryId для созданного ранее экземпляра Category.

    PartitionKey helmetsKey = new("gear-climb-helmets");
    
  8. Используйте метод UpsertItemAsync для создания или замены элемента, передавая объект для создаваемого элемента и значение ключа секции. Возвратите объект типа ItemResponse<T>.

    ItemResponse<Category> response = await container.UpsertItemAsync(helmets, helmetsKey);
    
  9. Печать различных свойств response консоли, включая уникальный идентификатор базового элемента, тип базового элемента и плату за запрос в секунду.

    Console.WriteLine($"[New item created]:\t{response.Resource.Id}\t(Type: {response.Resource.Type})\t(RUs: {response.RequestCharge})");
    
  10. Сохраните файл Program.cs.

Реализация нескольких операций в виде транзакционного пакета

Теперь рассмотрим сценарий, в котором необходимо создать несколько продуктов вместе с категорией. Если продукты созданы, но категории нет, то эти продукты не так полезны. Создание нескольких элементов — это ситуация, когда можно использовать транзакцию для группировки нескольких операций "точка" вместе, чтобы все они были успешными или завершились сбоем как одна единица. Возвращаясь к нашему сценарию, нам нужно создать категорию для наружных палаток с несколькими продуктами (палатками). У нас уже есть один элемент категории без каких-либо элементов продукта. Вот что должно быть в итоге:

Диаграмма: элементы в Azure Cosmos DB, сгруппированных по ключу секции.

В этом разделе мы создадим пакет транзакций для создания tents категории и связанных продуктов вместе.

  1. В 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"
    );
    
  2. Создайте четыре экземпляра типа 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
    };
    
  3. Теперь создайте экземпляр PartitionKey, используя значение gear-camp-tents.

    PartitionKey tentsKey = new("gear-camp-tents");
    
  4. Создайте транзакционный пакет, ограниченный значением ключа секции 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);
    
  5. Выведите сообщение в окно консоли, чтобы указать, что мы запускаем пакетную операцию.

    Console.WriteLine("[Batch started]");
    
  6. Используйте метод TransactionalBatch.ExecuteAsync для выполнения пакета и возврата специального типа ответа.

    using TransactionalBatchResponse batchResponse = await batch.ExecuteAsync();
    
  7. Используя цикл 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})");
    }
    
  8. Выводит другое сообщение в окно консоли, указывающее, что пакет завершен. Включите плату за запрос для всего пакета в этом сообщении.

    Console.WriteLine($"[Batch completed]:\t(RUs: {batchResponse.RequestCharge})");
    
  9. Сохраните файл Program.cs.

Проверьте свою работу

Теперь приложение создает несколько элементов и обеспечивает достаточную устойчивость для многократного запуска без исключения. Здесь вы запустите приложение и проверьте выходные данные для уникальных идентификаторов каждого из шести только что созданных элементов.

  1. Запустите приложение .NET в терминале:

    dotnet run
    
  2. Просмотрите выходные данные запуска приложения. Выходные данные должны соответствовать примеру:

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

    Совет

    ЕЗ в этом примере выходных данных могут отличаться от тех, которые в ваших выходных данных.