Cvičení – vytvoření nových položek
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:
- Vytvoření položky jednotlivě jako jedné operace
- Vytvoření více souvisejících položek pomocí transakční dávky
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í.
Znovu otevřete soubor Program.cs.
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" );
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");
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);
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})");
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" );
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");
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);
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})");
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:
V této části vytvoříme transakční dávku, která společně vytvoří tents
kategorii a související produkty.
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" );
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 };
Teď vytvořte novou PartitionKey instanci pomocí
gear-camp-tents
hodnoty.PartitionKey tentsKey = new("gear-camp-tents");
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);
Vypíšete do konzoly zprávu s oznámením, že spouštíme dávkovou operaci.
Console.WriteLine("[Batch started]");
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();
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})"); }
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})");
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.
Spusťte aplikaci .NET v terminálu:
dotnet run
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.