Latihan - Membuat item baru

Selesai

Ingat bahwa Anda dapat membuat item di dalam kontainer Anda menggunakan SDK Azure Cosmos DB untuk .NET. Untuk proyek ini, kontainer produk berisi item produk individual dan item kategori khusus untuk setiap kategori. Ada dua kasus yang ingin Anda tangani di aplikasi ini:

  • Jika kategori kosong, bukan masalah jika membuat item kategori tersebut satu per satu. Tidak ada item produk terkait untuk dibuat.
  • Namun, jika kategori menyertakan produk terkait, Anda ingin membuat item kategori dan item produk terkait secara bersamaan.

Saat ini, Anda memiliki dua persyaratan kunci:

  1. Membuat item satu per satu sebagai operasi tunggal
  2. Menggunakan batch transaksional untuk membuat beberapa item terkait

Illustration of icons indicating data being uploaded to the cloud.

Setelah Anda menyelesaikan latihan ini, proyek Anda akan memiliki logika untuk membuat item di kontainer Anda baik satu per satu atau sebagai batch.

Menambahkan item individual ke kontainer

Di Azure Cosmos DB, Anda dapat membuat, mengganti, atau melakukan upsert item ke kontainer. Membuat item mengharuskan item memiliki pengidentifikasi unik. Mengganti item mengharuskan item sudah ada. Upsert adalah yang terbaik dari kedua dunia, di mana ia memeriksa pengidentifikasi unik, lalu mengganti atau membuat item. Untuk proyek ini, Anda ingin dapat menjalankan aplikasi beberapa kali tanpa kesalahan, membuat upsert pilihan yang jelas. Untuk item pertama kami, kami membuat kategori yang tidak memiliki produk terkait. Di sini, Anda menerapkan satu operasi upsert dengan kategori yang dibuat secara manual.

  1. Buka file Program.cs lagi.

  2. Buat instans Kategori baru bernama goggles dengan nilai berikut:

    Properti Nilai
    id ef7fa0f1-0e9d-4435-aaaf-a778179a94ad
    categoryId gear-snow-goggles
    Category goggles = new(
        Id: "ef7fa0f1-0e9d-4435-aaaf-a778179a94ad",
        CategoryId: "gear-snow-goggles"
    );
    
  3. Buat instans PartitionKey baru menggunakan nilai yang sama dengan properti categoryId untuk instans Kategori yang Anda buat sebelumnya.

    PartitionKey gogglesKey = new("gear-snow-goggles");
    
  4. Gunakan metode UpsertItemAsync untuk membuat atau mengganti item yang melewati objek untuk item yang akan dibuat dan nilai kunci partisi.

    Category result = await container.UpsertItemAsync(goggles, gogglesKey);
    
  5. Cetak berbagai properti result ke konsol termasuk: Pengenal unik item dan jenis item.

    Console.WriteLine($"[New item created]:\t{result.Id}\t(Type: {result.Type})");
    
  6. Buat instans Kategori baru bernama helmets dengan nilai berikut:

    Properti Nilai
    id 91f79374-8611-4505-9c28-3bbbf1aa7df7
    categoryId gear-climb-helmets
    Category helmets = new(
        Id: "91f79374-8611-4505-9c28-3bbbf1aa7df7",
        CategoryId: "gear-climb-helmets"
    );
    
  7. Buat instans PartitionKey baru menggunakan nilai yang sama dengan properti categoryId untuk instans Kategori yang Anda buat sebelumnya.

    PartitionKey helmetsKey = new("gear-climb-helmets");
    
  8. Gunakan metode UpsertItemAsync untuk membuat atau mengganti item. Teruskan objek untuk item yang akan dibuat dan nilai kunci partisi. Kembalikan objek jenis ItemResponse<T>.

    ItemResponse<Category> response = await container.UpsertItemAsync(helmets, helmetsKey);
    
  9. Cetak berbagai properti response ke konsol termasuk: Pengenal unik item yang mendasar, jenis item yang mendasar, dan biaya permintaan dalam RU.

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

Menerapkan beberapa operasi sebagai batch transaksional

Sekarang, pertimbangkan skenario di mana Anda ingin membuat beberapa produk bersama dengan kategori. Jika produk sudah dibuat, tetapi kategorinya tidak ada, produk tersebut hampir tidak berguna. Membuat beberapa item adalah situasi saat Anda dapat menggunakan transaksi untuk mengelompokkan beberapa operasi "titik" bersamaan sehingga semuanya berhasil atau gagal sebagai satu unit kohesif. Kembali ke skenario kita, kita perlu membuat kategori untuk tenda luar ruangan dengan beberapa produk tenda. Kita sudah memiliki satu item kategori tanpa item produk apa pun. Beginilah seharusnya hasil akhir yang kita dapat:

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

Di bagian ini, kami membuat batch transaksi untuk membuat tents kategori dan produk terkait bersama-sama.

  1. Di Program.cs, buat instans Kategori baru bernama tents dengan nilai berikut:

    Properti Nilai
    id 5df21ec5-813c-423e-9ee9-1a2aaead0be4
    categoryId gear-camp-tents
    Category tents = new(
        Id: "5df21ec5-813c-423e-9ee9-1a2aaead0be4",
        CategoryId: "gear-camp-tents"
    );
    
  2. Buat empat instans jenis Produk menggunakan nilai-nilai ini.

    Properti 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
    Nama Cirroa Tent Kuloar Tent Mammatin Tent Nimbolo Tent
    Harga 490.00 530.00 0.00 330.00
    Diarsipkan false false true false
    Kuantitas 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. Sekarang, buat instans PartitionKey baru menggunakan nilai gear-camp-tents.

    PartitionKey tentsKey = new("gear-camp-tents");
    
  4. Buat batch transaksional baru yang dilingkup ke nilai kunci partisi gear-camp-tents menggunakan metode CreateTransactionalBatch(PartitionKey). Dengan menggunakan sintaks fasih, tambahkan lima operasi upsert untuk membuat item yang kita butuhkan di kontainer kita untuk kategori dan semua produk terkait.

    TransactionalBatch batch = container.CreateTransactionalBatch(tentsKey)
        .UpsertItem<Category>(tents)
        .UpsertItem<Product>(cirroa)
        .UpsertItem<Product>(kuloar)
        .UpsertItem<Product>(mammatin)
        .UpsertItem<Product>(nimbolo);
    
  5. Keluarkan pesan ke konsol untuk menunjukkan bahwa kita memulai operasi batch.

    Console.WriteLine("[Batch started]");
    
  6. Gunakan metode TransactionalBatch.ExecuteAsync untuk menjalankan batch dan mengembalikan jenis respons khusus.

    using TransactionalBatchResponse batchResponse = await batch.ExecuteAsync();
    
  7. Menggunakan untuk perulangan, iterasi melalui semua item di dalam respons. Pertama, konversikan setiap item ke jenis TransactionalBatchOperationResult menggunakan kelas dasar Item Anda sebagai generik. Kemudian, cetak pengenal unik dan jenis objek respons.

    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. Keluarkan pesan lain ke konsol yang menunjukkan bahwa batch selesai. Sertakan biaya permintaan untuk seluruh batch di pesan ini.

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

Periksa pekerjaan Anda

Aplikasi Anda sekarang membuat beberapa item dan dirancang agar cukup tangguh dijalankan beberapa kali tanpa menyebabkan pengecualian. Di sini, Anda menjalankan aplikasi dan memeriksa output untuk pengidentifikasi unik dari masing-masing dari enam item yang baru dibuat.

  1. Jalankan aplikasi .NET di terminal:

    dotnet run
    
  2. Amati output dari menjalankan aplikasi. Output harus cocok dengan contoh di sini:

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

    RU yang ditunjukkan dalam contoh output ini mungkin berbeda dengan output Anda.