Exercício - Criar novos itens

Concluído

Lembre-se de que você pode criar itens em seu contêiner usando o SDK do Azure Cosmos DB para .NET. Para este projeto, o contêiner de produtos contém os itens de produto individuais e itens de categoria especial para cada categoria. Há dois casos que você deseja tratar neste aplicativo:

  • Se uma categoria estiver vazia, não há problema em criar o item dessa categoria individualmente. Não há itens de produto relacionados para criar.
  • No entanto, se uma categoria incluir produtos relacionados, você deseja criar o item de categoria e os itens de produto relacionados simultaneamente.

Neste momento, você tem dois requisitos principais:

  1. Criar um item individualmente como uma única operação
  2. Usar um lote transacional para criar vários itens relacionados

Illustration of icons indicating data being uploaded to the cloud.

Depois de concluir este exercício, seu projeto terá a lógica para criar itens em seu contêiner individualmente ou como um lote.

Adicionar um item individual a um contêiner

No Azure Cosmos DB, você pode criar, substituir ou atualizar itens para um contêiner. Criar um item requer que o item tenha um identificador exclusivo. A substituição de um item requer que o item já exista. Upsert é o melhor dos dois mundos, onde verifica o identificador único e, em seguida, substitui ou cria o item. Para este projeto, você quer ser capaz de executar o aplicativo várias vezes sem erros, tornando upsert uma escolha clara. Para o nosso primeiro item, criamos uma categoria que não tem nenhum produto associado. Aqui, você implementa uma única operação de upsert com uma categoria criada manualmente.

  1. Abra o arquivo .cs programa mais uma vez.

  2. Crie uma nova instância de Category nomeada goggles com os seguintes valores:

    Property valor
    id ef7fa0f1-0e9d-4435-aaaf-a778179a94ad
    categoryId gear-snow-goggles
    Category goggles = new(
        Id: "ef7fa0f1-0e9d-4435-aaaf-a778179a94ad",
        CategoryId: "gear-snow-goggles"
    );
    
  3. Crie uma nova PartitionKey instância usando o mesmo valor da categoryId propriedade para a instância Category que você criou anteriormente.

    PartitionKey gogglesKey = new("gear-snow-goggles");
    
  4. Use o método para criar ou substituir o item que passa em um objeto para o UpsertItemAsync item a ser criado e um valor de chave de partição.

    Category result = await container.UpsertItemAsync(goggles, gogglesKey);
    
  5. Imprima várias propriedades do no console, incluindo: O identificador exclusivo do item e o tipo do result item.

    Console.WriteLine($"[New item created]:\t{result.Id}\t(Type: {result.Type})");
    
  6. Crie uma nova instância de Category nomeada helmets com os seguintes valores:

    Property valor
    id 91f79374-8611-4505-9c28-3bbbf1aa7df7
    categoryId gear-climb-helmets
    Category helmets = new(
        Id: "91f79374-8611-4505-9c28-3bbbf1aa7df7",
        CategoryId: "gear-climb-helmets"
    );
    
  7. Crie uma nova PartitionKey instância usando o mesmo valor da categoryId propriedade para a instância Category que você criou anteriormente.

    PartitionKey helmetsKey = new("gear-climb-helmets");
    
  8. Use o método para criar ou substituir o UpsertItemAsync item. Passe um objeto para o item a ser criado e um valor de chave de partição. Retornar um objeto do tipo ItemResponse<T>.

    ItemResponse<Category> response = await container.UpsertItemAsync(helmets, helmetsKey);
    
  9. Imprima várias propriedades do no console, incluindo: O identificador exclusivo do item subjacente, o tipo do response item subjacente e a taxa de solicitação em RUs.

    Console.WriteLine($"[New item created]:\t{response.Resource.Id}\t(Type: {response.Resource.Type})\t(RUs: {response.RequestCharge})");
    
  10. Salve o arquivo .cs programa.

Implementar várias operações como um lote transacional

Agora, considere um cenário em que você deseja criar vários produtos junto com uma categoria. Se os produtos são criados, mas a categoria não existe, esses produtos não são tão úteis. Criar vários itens é uma situação em que você pode usar uma transação para agrupar várias operações de "ponto" juntas para que todas tenham sucesso ou falhem como uma única unidade coesa. Voltando ao nosso cenário, precisamos criar uma categoria para tendas ao ar livre com alguns produtos de tenda. Nós já temos um único item de categoria sem nenhum item de produto. Aqui está o que devemos acabar:

Diagram of items in Azure Cosmos DB grouped by their partition key.

Nesta seção, criamos um lote transacional para criar a categoria e os tents produtos relacionados juntos.

  1. Em Program.cs, crie uma nova instância Category nomeada tents com os seguintes valores:

    Property valor
    id 5df21ec5-813c-423e-9ee9-1a2aaead0be4
    categoryId gear-camp-tents
    Category tents = new(
        Id: "5df21ec5-813c-423e-9ee9-1a2aaead0be4",
        CategoryId: "gear-camp-tents"
    );
    
  2. Crie quatro instâncias do tipo de produto usando esses valores.

    Property 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
    CategoriaId gear-camp-tents gear-camp-tents gear-camp-tents gear-camp-tents
    Nome Cirroa Tent Kuloar Tent Mammatin Tent Nimbolo Tent
    Preço 490.00 530.00 0.00 330.00
    Arquivado false false true false
    Quantidade 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. Agora, crie uma nova PartitionKey instância usando o gear-camp-tents valor.

    PartitionKey tentsKey = new("gear-camp-tents");
    
  4. Crie um novo lote transacional com escopo para o valor da chave de partição usando o gear-camp-tentsCreateTransactionalBatch(PartitionKey) método. Usando a sintaxe fluente, adicione cinco operações de upsert para criar os itens que precisamos em nosso contêiner para a categoria e todos os produtos relacionados.

    TransactionalBatch batch = container.CreateTransactionalBatch(tentsKey)
        .UpsertItem<Category>(tents)
        .UpsertItem<Product>(cirroa)
        .UpsertItem<Product>(kuloar)
        .UpsertItem<Product>(mammatin)
        .UpsertItem<Product>(nimbolo);
    
  5. Envie uma mensagem para o console indicando que estamos iniciando uma operação em lote.

    Console.WriteLine("[Batch started]");
    
  6. Use o método para executar o TransactionalBatch.ExecuteAsync lote e retornar um tipo de resposta especial.

    using TransactionalBatchResponse batchResponse = await batch.ExecuteAsync();
    
  7. Usando um loop for, itere todos os itens na resposta. Primeiro, converta cada item para o tipo TransactionalBatchOperationResult usando sua Item classe base como o genérico. Em seguida, imprima o identificador exclusivo e o tipo do objeto de resposta.

    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. Envie outra mensagem para o console indicando que o lote está concluído. Inclua a taxa de solicitação para todo o lote nesta mensagem.

    Console.WriteLine($"[Batch completed]:\t(RUs: {batchResponse.RequestCharge})");
    
  9. Salve o arquivo .cs programa.

Verifique o seu trabalho

Seu aplicativo agora cria vários itens e foi projetado para ser resiliente o suficiente para ser executado várias vezes sem causar uma exceção. Aqui, você executa o aplicativo e verifica a saída para os identificadores exclusivos de cada um dos seis itens recém-criados.

  1. Execute o aplicativo .NET no terminal:

    dotnet run
    
  2. Observe a saída da execução do aplicativo. A saída deve corresponder ao exemplo aqui:

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

    Gorjeta

    As RUs mostradas neste exemplo de saída podem variar da sua saída.