Ćwiczenie — tworzenie nowych elementów

Ukończone

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:

  1. Tworzenie elementu indywidualnie jako pojedynczej operacji
  2. Tworzenie wielu powiązanych elementów przy użyciu partii transakcyjnej

Illustration of icons indicating data being uploaded to the cloud.

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ą.

  1. Otwórz ponownie plik Program.cs.

  2. 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"
    );
    
  3. 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");
    
  4. 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);
    
  5. 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})");
    
  6. 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"
    );
    
  7. 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");
    
  8. 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);
    
  9. 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})");
    
  10. 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ć:

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

W tej sekcji utworzymy transakcyjną partię, aby utworzyć kategorię tents i powiązane produkty razem.

  1. 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"
    );
    
  2. 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
    };
    
  3. Teraz utwórz nowe PartitionKey wystąpienie przy użyciu gear-camp-tents wartości .

    PartitionKey tentsKey = new("gear-camp-tents");
    
  4. 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);
    
  5. Wyprowadź komunikat do konsoli, aby wskazać, że uruchamiamy operację wsadową.

    Console.WriteLine("[Batch started]");
    
  6. TransactionalBatch.ExecuteAsync Użyj metody , aby wykonać partię i zwrócić specjalny typ odpowiedzi.

    using TransactionalBatchResponse batchResponse = await batch.ExecuteAsync();
    
  7. Używając pętli for, iteruj wszystkie elementy w odpowiedzi. Najpierw przekonwertuj każdy element na typ TransactionalBatchOperationResult przy użyciu Item 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})");
    }
    
  8. 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})");
    
  9. 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.

  1. Uruchom aplikację .NET w terminalu:

    dotnet run
    
  2. 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.