Övning – Skapa nya objekt

Slutförd

Kom ihåg att du kan skapa objekt i containern med hjälp av Azure Cosmos DB SDK för .NET. För det här projektet innehåller produktcontainern både enskilda produktartiklar och särskilda kategoriobjekt för varje kategori. Det finns två fall som du vill hantera i det här programmet:

  • Om en kategori är tom är det bra att bara skapa kategorins objekt individuellt. Det finns inga relaterade produktobjekt att skapa.
  • Men om en kategori innehåller relaterade produkter vill du skapa kategoriobjektet och de relaterade produktobjekten samtidigt.

Just nu har du två viktiga krav:

  1. Skapa ett objekt individuellt som en enskild åtgärd
  2. Använda en transaktionsbatch för att skapa flera relaterade objekt

Illustration of icons indicating data being uploaded to the cloud.

När du har slutfört den här övningen har projektet logiken för att skapa objekt i containern antingen individuellt eller som en batch.

Lägga till ett enskilt objekt i en container

I Azure Cosmos DB kan du skapa, ersätta eller ansluta objekt till en container. För att skapa ett objekt måste objektet ha en unik identifierare. För att ersätta ett objekt krävs att objektet redan finns. Upsert är det bästa av två världar, där det kontrollerar den unika identifieraren och sedan ersätter eller skapar objektet. För det här projektet vill du kunna köra appen flera gånger utan fel, vilket utgör ett tydligt val. För vårt första objekt skapar vi en kategori som inte har några associerade produkter. Här implementerar du en enda upsert-åtgärd med en manuellt skapad kategori.

  1. Öppna filen Program.cs igen.

  2. Skapa en ny kategoriinstans med namnet goggles med följande värden:

    Property Värde
    id ef7fa0f1-0e9d-4435-aaaf-a778179a94ad
    Kategorinr gear-snow-goggles
    Category goggles = new(
        Id: "ef7fa0f1-0e9d-4435-aaaf-a778179a94ad",
        CategoryId: "gear-snow-goggles"
    );
    
  3. Skapa en ny PartitionKey instans med samma värde som categoryId egenskapen för den kategoriinstans som du skapade tidigare.

    PartitionKey gogglesKey = new("gear-snow-goggles");
    
  4. UpsertItemAsync Använd metoden för att skapa eller ersätta objektet som skickar in ett objekt för objektet som ska skapas och ett partitionsnyckelvärde.

    Category result = await container.UpsertItemAsync(goggles, gogglesKey);
    
  5. Skriv ut olika egenskaper result för konsolen, inklusive: Objektets unika identifierare och typen av objekt.

    Console.WriteLine($"[New item created]:\t{result.Id}\t(Type: {result.Type})");
    
  6. Skapa en ny kategoriinstans med namnet helmets med följande värden:

    Property Värde
    id 91f79374-8611-4505-9c28-3bbbf1aa7df7
    Kategorinr gear-climb-helmets
    Category helmets = new(
        Id: "91f79374-8611-4505-9c28-3bbbf1aa7df7",
        CategoryId: "gear-climb-helmets"
    );
    
  7. Skapa en ny PartitionKey instans med samma värde som categoryId egenskapen för den kategoriinstans som du skapade tidigare.

    PartitionKey helmetsKey = new("gear-climb-helmets");
    
  8. UpsertItemAsync Använd metoden för att skapa eller ersätta objektet. Skicka in ett objekt för objektet som ska skapas och ett partitionsnyckelvärde. Returnera ett objekt av typen ItemResponse<T>.

    ItemResponse<Category> response = await container.UpsertItemAsync(helmets, helmetsKey);
    
  9. Skriv ut olika egenskaper response för konsolen, inklusive: Den unika identifieraren för det underliggande objektet, typen av det underliggande objektet och begärandeavgiften i RU:er.

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

Implementera flera åtgärder som en transaktionsbatch

Tänk dig nu ett scenario där du vill skapa flera produkter tillsammans med en kategori. Om produkterna skapas, men kategorin inte finns, är dessa produkter inte alls lika användbara. Att skapa flera objekt är en situation där du kan använda en transaktion för att gruppera flera "punktåtgärder" så att alla lyckas eller misslyckas som en enda sammanhängande enhet. När vi går tillbaka till vårt scenario måste vi skapa en kategori för utomhustält med några tältprodukter. Vi har redan ett enskilt kategoriobjekt utan några produktartiklar. Här är vad vi bör sluta med:

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

I det här avsnittet skapar vi en transaktionsbatch för att skapa tents kategorin och relaterade produkter tillsammans.

  1. I Program.cs skapar du en ny kategoriinstans med namnet tents med följande värden:

    Property Värde
    id 5df21ec5-813c-423e-9ee9-1a2aaead0be4
    Kategorinr gear-camp-tents
    Category tents = new(
        Id: "5df21ec5-813c-423e-9ee9-1a2aaead0be4",
        CategoryId: "gear-camp-tents"
    );
    
  2. Skapa fyra instanser av produkttypen med hjälp av dessa värden.

    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
    Kategorinr gear-camp-tents gear-camp-tents gear-camp-tents gear-camp-tents
    Namn Cirroa Tent Kuloar Tent Mammatin Tent Nimbolo Tent
    Pris 490.00 530.00 0.00 330.00
    Arkiverade false false true false
    Antal 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. Skapa nu en ny PartitionKey instans med hjälp av gear-camp-tents värdet.

    PartitionKey tentsKey = new("gear-camp-tents");
    
  4. Skapa en ny transaktionsbatch som är begränsad till partitionsnyckelvärdet gear-camp-tents med hjälp av CreateTransactionalBatch(PartitionKey) metoden . Med hjälp av fluent-syntaxen lägger du till fem upsert-åtgärder för att skapa de objekt vi behöver i containern för kategorin och alla relaterade produkter.

    TransactionalBatch batch = container.CreateTransactionalBatch(tentsKey)
        .UpsertItem<Category>(tents)
        .UpsertItem<Product>(cirroa)
        .UpsertItem<Product>(kuloar)
        .UpsertItem<Product>(mammatin)
        .UpsertItem<Product>(nimbolo);
    
  5. Skicka ett meddelande till konsolen om att vi startar en batchåtgärd.

    Console.WriteLine("[Batch started]");
    
  6. TransactionalBatch.ExecuteAsync Använd metoden för att köra batchen och returnera en särskild svarstyp.

    using TransactionalBatchResponse batchResponse = await batch.ExecuteAsync();
    
  7. Med hjälp av en for-loop itererar du igenom alla objekt i svaret. Konvertera först varje objekt till den typ TransactionalBatchOperationResult som använder basklassen Item som allmän. Skriv sedan ut den unika identifieraren och typen av svarsobjekt.

    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. Skicka ett annat meddelande till konsolen som anger att batchen är klar. Inkludera begärandeavgiften för hela batchen i det här meddelandet.

    Console.WriteLine($"[Batch completed]:\t(RUs: {batchResponse.RequestCharge})");
    
  9. Spara filen Program.cs.

Kontrollera ditt arbete

Din app skapar nu flera objekt och är utformad för att vara tillräckligt motståndskraftig för att köras flera gånger utan att orsaka ett undantag. Här kör du programmet och kontrollerar utdata för de unika identifierarna för vart och ett av de sex nyligen skapade objekten.

  1. Kör .NET-programmet i terminalen:

    dotnet run
    
  2. Observera utdata från körningen av programmet. Utdata ska matcha exemplet här:

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

    Dricks

    Ru:erna som visas i det här exemplets utdata kan variera från dina utdata.