Cvičení – vytvoření nových položek

Dokončeno

Vzpomeňte si, že v kontejneru můžete vytvářet položky pomocí sady SDK služby Azure Cosmos DB pro .NET. Pro tento projekt obsahuje kontejner produktů jednotlivé položky produktu i položky zvláštní kategorie pro každou kategorii. V této aplikaci chcete zpracovat dva případy:

  • Pokud je kategorie prázdná, stačí vytvořit položku dané kategorie jednotlivě. Neexistují žádné související položky produktu, které by bylo potřeba vytvořit.
  • Pokud ale kategorie obsahuje související produkty, chcete vytvořit položku kategorie a související položky produktu současně.

Právě teď máte dva klíčové požadavky:

  1. Vytvoření položky jednotlivě jako jedné operace
  2. Vytvoření více souvisejících položek pomocí transakční dávky

Illustration of icons indicating data being uploaded to the cloud.

Po dokončení tohoto cvičení bude mít váš projekt logiku pro vytvoření položek v kontejneru jednotlivě nebo jako dávku.

Přidání jednotlivé položky do kontejneru

Ve službě Azure Cosmos DB můžete vytvářet, nahrazovat nebo upsertovat položky do kontejneru. Vytvoření položky vyžaduje, aby položka má jedinečný identifikátor. Nahrazení položky vyžaduje, aby položka již existuje. Upsert je nejlepší z obou světů, kde zkontroluje jedinečný identifikátor a pak nahradí nebo vytvoří položku. U tohoto projektu chcete mít možnost aplikaci spustit několikrát bez chyb a vytvořit tak jasnou volbu. Pro naši první položku vytvoříme kategorii, která neobsahuje žádné přidružené produkty. V této části implementujete jednu operaci upsertu s ručně vytvořenou kategorií.

  1. Znovu otevřete soubor Program.cs.

  2. Vytvořte novou instanci kategorie s názvem goggles s následujícími hodnotami:

    Vlastnost Hodnota
    id ef7fa0f1-0e9d-4435-aaaf-a778179a94ad
    Categoryid gear-snow-goggles
    Category goggles = new(
        Id: "ef7fa0f1-0e9d-4435-aaaf-a778179a94ad",
        CategoryId: "gear-snow-goggles"
    );
    
  3. Vytvořte novou PartitionKey instanci se stejnou hodnotou jako categoryId vlastnost pro instanci Kategorie , kterou jste vytvořili dříve.

    PartitionKey gogglesKey = new("gear-snow-goggles");
    
  4. UpsertItemAsync Pomocí metody vytvořte nebo nahraďte položku předanou objekt pro položku k vytvoření a hodnotu klíče oddílu.

    Category result = await container.UpsertItemAsync(goggles, gogglesKey);
    
  5. Vytiskněte různé vlastnosti result konzoly, včetně: Jedinečný identifikátor položky a typ položky.

    Console.WriteLine($"[New item created]:\t{result.Id}\t(Type: {result.Type})");
    
  6. Vytvořte novou instanci kategorie s názvem helmets s následujícími hodnotami:

    Vlastnost Hodnota
    id 91f79374-8611-4505-9c28-3bbbf1aa7df7
    Categoryid gear-climb-helmets
    Category helmets = new(
        Id: "91f79374-8611-4505-9c28-3bbbf1aa7df7",
        CategoryId: "gear-climb-helmets"
    );
    
  7. Vytvořte novou PartitionKey instanci se stejnou hodnotou jako categoryId vlastnost pro instanci Kategorie , kterou jste vytvořili dříve.

    PartitionKey helmetsKey = new("gear-climb-helmets");
    
  8. UpsertItemAsync Pomocí metody vytvořte nebo nahraďte položku. Předejte objekt pro položku k vytvoření a hodnotu klíče oddílu. Vrátí objekt typu ItemResponse<T>.

    ItemResponse<Category> response = await container.UpsertItemAsync(helmets, helmetsKey);
    
  9. Vytiskněte různé vlastnosti response konzoly, včetně: jedinečný identifikátor podkladové položky, typu podkladové položky a poplatku za žádost v RU.

    Console.WriteLine($"[New item created]:\t{response.Resource.Id}\t(Type: {response.Resource.Type})\t(RUs: {response.RequestCharge})");
    
  10. Uložte soubor Program.cs.

Implementace více operací jako transakční dávky

Teď zvažte scénář, ve kterém chcete vytvořit více produktů společně s kategorií. Pokud jsou produkty vytvořené, ale kategorie neexistuje, tyto produkty nejsou tak užitečné. Vytvoření více položek je situace, kdy můžete pomocí transakce seskupit více operací "point" dohromady, aby všechny byly úspěšné nebo neúspěšné jako jedna soudržná jednotka. Když se vrátíme k našemu scénáři, musíme vytvořit kategorii pro venkovní stany s několika produkty pro stany. Už máme jednu položku kategorie bez jakýchkoli položek produktu. Tady je postup, kterým bychom měli skončit:

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

V této části vytvoříme transakční dávku, která společně vytvoří tents kategorii a související produkty.

  1. V souboru Program.cs vytvořte novou instanci kategorie s následujícími tents hodnotami:

    Vlastnost Hodnota
    id 5df21ec5-813c-423e-9ee9-1a2aaead0be4
    Categoryid gear-camp-tents
    Category tents = new(
        Id: "5df21ec5-813c-423e-9ee9-1a2aaead0be4",
        CategoryId: "gear-camp-tents"
    );
    
  2. Pomocí těchto hodnot vytvořte čtyři instance typu Produkt .

    Vlastnost 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
    Název Cirroa Tent Kuloar Tent Mammatin Tent Nimbolo Tent
    Cena 490.00 530.00 0.00 330.00
    Archivované false false true false
    Množství 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. Teď vytvořte novou PartitionKey instanci pomocí gear-camp-tents hodnoty.

    PartitionKey tentsKey = new("gear-camp-tents");
    
  4. Pomocí metody vytvořte novou transakční dávku s oborem gear-camp-tents na hodnotu klíče oddílu CreateTransactionalBatch(PartitionKey) . Pomocí fluent syntaxe přidejte pět operací upsertu k vytvoření položek, které potřebujeme v našem kontejneru pro kategorii a všechny související produkty.

    TransactionalBatch batch = container.CreateTransactionalBatch(tentsKey)
        .UpsertItem<Category>(tents)
        .UpsertItem<Product>(cirroa)
        .UpsertItem<Product>(kuloar)
        .UpsertItem<Product>(mammatin)
        .UpsertItem<Product>(nimbolo);
    
  5. Vypíšete do konzoly zprávu s oznámením, že spouštíme dávkovou operaci.

    Console.WriteLine("[Batch started]");
    
  6. Použijte metodu TransactionalBatch.ExecuteAsync ke spuštění dávky a vrácení speciálního typu odpovědi.

    using TransactionalBatchResponse batchResponse = await batch.ExecuteAsync();
    
  7. Pomocí smyčky for iterujte všechny položky v odpovědi. Nejprve převeďte každou položku na typ TransactionalBatchOperationResult pomocí základní Item třídy jako obecné. Potom vytiskněte jedinečný identifikátor a typ objektu odpovědi.

    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. Výstupem další zprávy do konzoly, která indikuje, že dávka je dokončená. Do této zprávy zahrňte poplatek za žádost pro celou dávku.

    Console.WriteLine($"[Batch completed]:\t(RUs: {batchResponse.RequestCharge})");
    
  9. Uložte soubor Program.cs.

Kontrola práce

Vaše aplikace teď vytváří více položek a je navržená tak, aby byla dostatečně odolná, aby se spustila vícekrát, aniž by způsobila výjimku. Tady spustíte aplikaci a zkontrolujete výstup jedinečných identifikátorů všech šesti nově vytvořených položek.

  1. Spusťte aplikaci .NET v terminálu:

    dotnet run
    
  2. Sledujte výstup spuštění aplikace. Výstup by se měl shodovat s následujícím příkladem:

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

    Tip

    Jednotky RU zobrazené v tomto příkladu výstupu se můžou lišit od výstupu.