Ćwiczenie — tworzenie nowych elementów
Pamiętaj, że elementy w kontenerze można tworzyć przy użyciu zestawu SDK usługi Azure Cosmos DB dla platformy .NET. W tym projekcie kontener products zawiera zarówno poszczególne elementy produktu , jak i specjalne elementy kategorii dla każdej kategorii . Istnieją dwa przypadki, które chcesz obsłużyć w tej aplikacji:
- Jeśli kategoria jest pusta, wystarczy utworzyć pojedynczy element tej kategorii. Nie ma powiązanych elementów produktu do utworzenia.
- Jeśli jednak kategoria zawiera powiązane produkty, chcesz jednocześnie utworzyć element kategorii i powiązane elementy produktu.
W tej chwili masz dwa kluczowe wymagania:
- Tworzenie elementu indywidualnie jako pojedynczej operacji
- Tworzenie wielu powiązanych elementów przy użyciu partii transakcyjnej
Po zakończeniu tego ćwiczenia projekt będzie miał logikę tworzenia elementów w kontenerze pojedynczo lub jako partia.
Dodawanie pojedynczego elementu do kontenera
W usłudze Azure Cosmos DB można tworzyć, zastępować lub upsert elementy do kontenera. Utworzenie elementu wymaga, aby element miał unikatowy identyfikator. Zastąpienie elementu wymaga, aby element już istnieje. Upsert jest najlepszym z obu światów, gdzie sprawdza unikatowy identyfikator, a następnie zastępuje lub tworzy element. W tym projekcie chcesz mieć możliwość wielokrotnego uruchamiania aplikacji bez błędów, dzięki czemu upsert jest wyraźnym wyborem. W przypadku naszego pierwszego elementu utworzymy kategorię, która nie ma żadnych skojarzonych produktów. W tym miejscu zaimplementujesz pojedynczą operację upsert z ręcznie utworzoną kategorią.
Otwórz ponownie plik Program.cs.
Utwórz nowe wystąpienie kategorii o nazwie
goggles
z następującymi wartościami:Właściwości Wartość id ef7fa0f1-0e9d-4435-aaaf-a778179a94ad
Idkategorii gear-snow-goggles
Category goggles = new( Id: "ef7fa0f1-0e9d-4435-aaaf-a778179a94ad", CategoryId: "gear-snow-goggles" );
Utwórz nowe PartitionKey wystąpienie przy użyciu tej samej wartości co
categoryId
właściwość dla utworzonego wcześniej wystąpienia kategorii .PartitionKey gogglesKey = new("gear-snow-goggles");
UpsertItemAsync Użyj metody , aby utworzyć lub zastąpić element przekazujący obiekt dla elementu, aby utworzyć i wartość klucza partycji.
Category result = await container.UpsertItemAsync(goggles, gogglesKey);
Drukuj różne właściwości
result
do konsoli, w tym: unikatowy identyfikator elementu i typ elementu.Console.WriteLine($"[New item created]:\t{result.Id}\t(Type: {result.Type})");
Utwórz nowe wystąpienie kategorii o nazwie
helmets
z następującymi wartościami:Właściwości Wartość id 91f79374-8611-4505-9c28-3bbbf1aa7df7
Idkategorii gear-climb-helmets
Category helmets = new( Id: "91f79374-8611-4505-9c28-3bbbf1aa7df7", CategoryId: "gear-climb-helmets" );
Utwórz nowe PartitionKey wystąpienie przy użyciu tej samej wartości co
categoryId
właściwość dla utworzonego wcześniej wystąpienia kategorii .PartitionKey helmetsKey = new("gear-climb-helmets");
UpsertItemAsync Użyj metody , aby utworzyć lub zamienić element. Przekaż obiekt dla elementu, aby utworzyć i wartość klucza partycji. Zwróć obiekt typu ItemResponse<T>.
ItemResponse<Category> response = await container.UpsertItemAsync(helmets, helmetsKey);
Drukuj różne właściwości
response
konsoli, w tym: unikatowy identyfikator elementu bazowego, typ elementu bazowego i opłatę za żądanie w jednostkach RU.Console.WriteLine($"[New item created]:\t{response.Resource.Id}\t(Type: {response.Resource.Type})\t(RUs: {response.RequestCharge})");
Zapisz plik Program.cs.
Implementowanie wielu operacji jako partii transakcyjnej
Teraz rozważmy scenariusz, w którym chcesz utworzyć wiele produktów wraz z kategorią. Jeśli produkty są tworzone, ale kategoria nie istnieje, te produkty nie są prawie tak przydatne. Tworzenie wielu elementów jest sytuacją, w której można użyć transakcji do grupowania wielu operacji "punktów", aby wszystkie zakończyły się powodzeniem lub niepowodzeniem jako pojedyncza spójna jednostka. Wracając do naszego scenariusza, musimy utworzyć kategorię dla namiotów na świeżym powietrzu z kilkoma produktami namiotowymi. Mamy już jeden element kategorii bez żadnych produktów. Oto, co powinniśmy zrobić:
W tej sekcji utworzymy transakcyjną partię, aby utworzyć kategorię tents
i powiązane produkty razem.
W pliku Program.cs utwórz nowe wystąpienie kategorii o nazwie
tents
z następującymi wartościami:Właściwości Wartość id 5df21ec5-813c-423e-9ee9-1a2aaead0be4
Idkategorii gear-camp-tents
Category tents = new( Id: "5df21ec5-813c-423e-9ee9-1a2aaead0be4", CategoryId: "gear-camp-tents" );
Utwórz cztery wystąpienia typu Product przy użyciu tych wartości.
Właściwości 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
Idkategorii gear-camp-tents
gear-camp-tents
gear-camp-tents
gear-camp-tents
Nazwa/nazwisko Cirroa Tent
Kuloar Tent
Mammatin Tent
Nimbolo Tent
Cena 490.00
530.00
0.00
330.00
Archiwizowane false
false
true
false
Ilość 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 };
Teraz utwórz nowe PartitionKey wystąpienie przy użyciu
gear-camp-tents
wartości .PartitionKey tentsKey = new("gear-camp-tents");
Utwórz nową transakcyjną partię
gear-camp-tents
o zakresie wartości klucza partycji przy użyciu CreateTransactionalBatch(PartitionKey) metody . Używając płynnej składni, dodaj pięć operacji upsert , aby utworzyć elementy potrzebne w naszym kontenerze dla kategorii i wszystkich powiązanych produktów.TransactionalBatch batch = container.CreateTransactionalBatch(tentsKey) .UpsertItem<Category>(tents) .UpsertItem<Product>(cirroa) .UpsertItem<Product>(kuloar) .UpsertItem<Product>(mammatin) .UpsertItem<Product>(nimbolo);
Wyprowadź komunikat do konsoli, aby wskazać, że uruchamiamy operację wsadową.
Console.WriteLine("[Batch started]");
TransactionalBatch.ExecuteAsync
Użyj metody , aby wykonać partię i zwrócić specjalny typ odpowiedzi.using TransactionalBatchResponse batchResponse = await batch.ExecuteAsync();
Używając pętli for, iteruj wszystkie elementy w odpowiedzi. Najpierw przekonwertuj każdy element na typ
TransactionalBatchOperationResult
przy użyciuItem
klasy bazowej jako ogólny. Następnie wyświetl unikatowy identyfikator i typ obiektu odpowiedzi.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})"); }
Wyprowadź kolejny komunikat do konsoli wskazujący, że partia została ukończona. Dołącz opłatę za żądanie dla całej partii w tej wiadomości.
Console.WriteLine($"[Batch completed]:\t(RUs: {batchResponse.RequestCharge})");
Zapisz plik Program.cs.
Sprawdź swoją pracę
Aplikacja tworzy teraz wiele elementów i została zaprojektowana tak, aby była wystarczająco odporna, aby była uruchamiana wiele razy bez powodowania wyjątku. W tym miejscu uruchomisz aplikację i sprawdzisz dane wyjściowe unikatowych identyfikatorów każdego z sześciu nowo utworzonych elementów.
Uruchom aplikację .NET w terminalu:
dotnet run
Obserwuj dane wyjściowe uruchamiania aplikacji. Dane wyjściowe powinny być zgodne z przykładem w tym miejscu:
... [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)
Napiwek
Jednostki RU pokazane w tym przykładowym danych wyjściowych mogą różnić się od danych wyjściowych.