Öğretici: NoSQL için Azure Cosmos DB ile .NET konsol uygulaması geliştirme
UYGULANANLAR: NoSQL
.NET için Azure SDK, NoSQL kapsayıcısı için bir API'ye zaman uyumsuz tek tek işlemler veya işlem toplu işlemi eklemenizi sağlar. Bu öğretici, kapsayıcıya birden çok öğe ekleyen yeni bir .NET konsol uygulaması oluşturma işleminde yol gösterir.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- NoSQL için API kullanarak veritabanı oluşturma
- .NET konsol uygulaması oluşturma ve .NET için Azure SDK'sını ekleme
- NoSQL kapsayıcısı için BIR API'ye tek tek öğeler ekleme
- NoSQL kapsayıcısı için API'den verimli öğeler alma
- NoSQL kapsayıcısı için API'ye yönelik toplu değişikliklerle işlem oluşturma
Önkoşullar
- Mevcut bir NoSQL için Azure Cosmos DB hesabı.
- Mevcut bir Azure aboneliğiniz varsa yeni bir hesap oluşturun.
- Azure aboneliği yok mu? Kredi kartı gerektirmeden Azure Cosmos DB'i ücretsiz deneyebilirsiniz.
- Visual Studio Code
- .NET 8 veya üzeri
- C# uygulamaları yazma deneyimi.
NoSQL kaynakları için API oluşturma
İlk olarak, NoSQL hesabı için mevcut API'de boş bir veritabanı oluşturun. Daha sonra .NET için Azure SDK'sını kullanarak bir kapsayıcı oluşturursunuz.
Azure portalında mevcut NoSQL hesabı API'nize gidin.
Kaynak menüsünde Anahtarlar'ı seçin.
Anahtarlar sayfasında URI ve BİRİnCİl ANAHTAR alanlarının değerini gözlemleyin ve kaydedin. Bu değerler öğretici boyunca kullanılır.
Kaynak menüsünde Veri Gezgini'ı seçin.
Veri Gezgini sayfasında, komut çubuğundaKi Yeni Veritabanı seçeneğini belirleyin.
Yeni Veritabanı iletişim kutusunda aşağıdaki ayarlarla yeni bir kapsayıcı oluşturun:
Değer Veritabanı kimliği cosmicworks
Veritabanı aktarım hızı türü El ile Veritabanı aktarım hızı miktarı 400
Veritabanını oluşturmak için Tamam'ı seçin.
.NET konsol uygulaması oluşturma
Şimdi yeni bir .NET konsol uygulaması oluşturacak ve NuGet kitaplığını kullanarak .NET için Azure SDK'yı Microsoft.Azure.Cosmos
içeri aktaracaksınız.
Boş bir dizinde bir terminal açın.
Yerleşik şablonu kullanarak
console
yeni bir konsol uygulaması oluşturmadotnet new console --langVersion preview
NuGet'ten paketin 3.31.1-preview sürümünü
Microsoft.Azure.Cosmos
ekleyin.dotnet add package Microsoft.Azure.Cosmos --version 3.31.1-preview
Ayrıca, NuGet'ten paketin
System.CommandLine
yayın öncesi sürümünü ekleyin.dotnet add package System.CommandLine --prerelease
Ayrıca NuGet'ten
Humanizer
paketi ekleyin.dotnet add package Humanizer
Konsol uygulaması projesini oluşturun.
dotnet build
Çalışma alanı olarak geçerli proje klasörünü kullanarak Visual Studio Code'yu açın.
İpucu
Terminalde çalıştırarak
code .
Visual Studio Code'u açabilir ve çalışma dizinini otomatik olarak geçerli çalışma alanı olarak açabilirsiniz.Program.cs dosyasına gidin ve dosyayı açın. Dosyadaki mevcut kodun tümünü silin.
Ve
--last
seçenekleri aracılığıyla geçirilen iki dize için komut satırını ayrıştırmak üzere System.CommandLine kitaplığını kullanmak üzere bu kodu dosyaya--first
ekleyin.using System.CommandLine; var command = new RootCommand(); var nameOption = new Option<string>("--name") { IsRequired = true }; var emailOption = new Option<string>("--email"); var stateOption = new Option<string>("--state") { IsRequired = true }; var countryOption = new Option<string>("--country") { IsRequired = true }; command.AddOption(nameOption); command.AddOption(emailOption); command.AddOption(stateOption); command.AddOption(countryOption); command.SetHandler( handle: CosmosHandler.ManageCustomerAsync, nameOption, emailOption, stateOption, countryOption ); await command.InvokeAsync(args);
Not
Bu öğreticide, komut satırı ayrıştırıcısının nasıl çalıştığını anlamanız tamamen önemli değildir. Ayrıştırıcı, uygulama çalışırken belirtilebilen dört seçeneğe sahiptir. Kimlik ve bölüm anahtarı alanlarını oluşturmak için kullanılacakları için seçeneklerden üçü gereklidir.
Bu noktada, statik
CosmosHandler.ManageCustomerAsync
yöntemi henüz tanımlamadığınız için proje derlenmez.Program.cs dosyasını kaydedin.
SDK kullanarak kapsayıcıya öğe ekleme
Ardından, NoSQL kapsayıcısı için API'ye öğe eklemek için tek tek işlemleri kullanırsınız. Bu bölümde yöntemini tanımlarsınız CosmosHandler.ManageCustomerAsync
.
Yeni bir CosmosHandler.cs dosyası oluşturun.
CosmosHandler.cs dosyasında ve
Microsoft.Azure.Cosmos
ad alanları içinHumanizer
yeni bir using yönergesi ekleyin.using Humanizer; using Microsoft.Azure.Cosmos;
adlı
CosmosHandler
yeni bir statik sınıf oluşturun.public static class CosmosHandler { }
Bu uygulamanın çalıştığını doğrulamak için, komut satırı girişini yazdırmak için statik
ManageCustomerAsync
yöntemin kısa bir uygulamasını oluşturun.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { await Console.Out.WriteLineAsync($"Hello {name} of {state}, {country}!"); }
CosmosHandler.cs dosyasını kaydedin.
Terminale geri dönüp uygulamayı çalıştırın.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Komutun çıkışı eğlenceli bir karşılama olmalıdır.
Hello Mica Pereira of Washington, United States!
CosmosHandler.cs dosyasına dönün.
Statik CosmosHandler sınıfı içinde adlı
_client
türündeCosmosClient
yeniprivate static readonly
bir üye ekleyin.private static readonly CosmosClient _client;
sınıfı için
CosmosHandler
yeni bir statik oluşturucu oluşturun.static CosmosHandler() { }
Oluşturucu içinde, daha önce laboratuvarda
CosmosClient
kaydettiğiniz URI ve BİRİnCİl ANAHTAR değerleriyle iki dize parametresini geçirerek sınıfın yeni bir örneğini oluşturun. Bu yeni örneği üyede depolayın_client
.static CosmosHandler() { _client = new CosmosClient( accountEndpoint: "<uri>", authKeyOrResourceToken: "<primary-key>" ); }
Statik CosmosHandler sınıfına geri dönüp adlı yeni bir zaman uyumsuz yöntem
GetContainerAsync
oluşturun.Container
private static async Task<Container> GetContainerAsync() { }
Sonraki adımlar için bu kodu yöntemine
GetContainerAsync
ekleyin.cosmicworks
Veritabanını alın ve adlıdatabase
bir değişkende depolayın.Database database = _client.GetDatabase("cosmicworks");
Hiyerarşik bölüm anahtarı yolları listesinde yeni bir değer geneli
List<>
string
oluşturun ve adlıkeyPaths
bir değişkende depolayın.List<string> keyPaths = new() { "/address/country", "/address/state" };
Kapsayıcı adı (
customers
) ve bölüm anahtarı yolları listesiyle yeniContainerProperties
bir değişken oluşturun.ContainerProperties properties = new( id: "customers", partitionKeyPaths: keyPaths );
CreateContainerIfNotExistsAsync
Kapsayıcı özelliklerini sağlamak ve kapsayıcıyı almak için yöntemini kullanın. Bu yöntem, veritabanında zaten yoksa, ad başına kapsayıcıyı zaman uyumsuz olarak oluşturur. Sonucu yöntemin çıktısıGetContainerAsync
olarak döndürür.return await database.CreateContainerIfNotExistsAsync( containerProperties: properties );
yöntemindeki tüm kodu
ManageCustomerAsync
silin.Sonraki adımlar için bu kodu yöntemine
ManageCustomerAsync
ekleyin.yöntemini zaman uyumsuz olarak çağırın
GetContainerAsync
ve sonucu adlıcontainer
bir değişkende depolayın.Container container = await GetContainerAsync();
Yöntem parametresini
Kebaberize
dönüştürmekname
için Humanizer yöntemini kullanan adlıid
yeni bir değişken oluşturun.string id = name.Kebaberize();
Not
Kebaberize
yöntemi, tüm boşlukları kısa çizgilerle değiştirir ve metni küçük harfle yakınsar., ,
state
ve yöntem parametrelerini vecountry
değişkenininame
id
kullanarak yeni bir anonim türlenmiş öğe oluşturun. Öğeyi adlıcustomer
bir değişken olarak depolayın.var customer = new { id = id, name = name, address = new { state = state, country = country } };
Kapsayıcıda yeni bir öğe oluşturmak ve HTTP yanıt meta verilerini adlı
response
bir değişkene atamak için kapsayıcının zaman uyumsuzCreateItemAsync
yöntemini kullanın.var response = await container.CreateItemAsync(customer);
Değişkenin
response
StatusCode
veRequestCharge
özelliklerinin değerlerini konsola yazın. Değişkenin değeriniid
de yazın.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
CosmosHandler.cs dosyasını kaydedin.
Terminale geri dönüp uygulamayı yeniden çalıştırın.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Komutun çıktısı işlem için bir durum ve istek ücreti içermelidir.
[Created] mica-pereira 7.05 RUs
Not
İstek ücretiniz farklılık gösterebilir.
Uygulamayı bir kez daha çalıştırın.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Bu kez program kilitlenmelidir. Hata iletisinde kaydırma yaparsanız, kilitlenmenin öğelerin benzersiz tanımlayıcısında bir çakışma nedeniyle oluştuğunı görürsünüz.
Unhandled exception: Microsoft.Azure.Cosmos.CosmosException : Response status code does not indicate success: Conflict (409);Reason: ( Errors : [ "Resource with specified id or name already exists." ] );
SDK kullanarak öğe alma
Kapsayıcıda ilk öğenizi oluşturduğunuza göre, öğeyi almak için aynı SDK'yı kullanabilirsiniz. Burada, istek birimi (RU) tüketimindeki farkı karşılaştırmak için öğeyi sorgulayıp nokta okuması yapacaksınız.
CosmosHandler.cs dosyasına dönün veya dosyayı açın.
yöntemden
ManageCustomerAsync
ilk iki satır dışındaki tüm kod satırlarını silin.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { Container container = await GetContainerAsync(); string id = name.Kebaberize(); }
Sonraki adımlar için bu kodu yöntemine
ManageCustomerAsync
ekleyin.Kapsayıcıda yeni bir öğe oluşturmak ve HTTP yanıt meta verilerini adlı
response
bir değişkene atamak için kapsayıcının zaman uyumsuzCreateItemAsync
yöntemini kullanın.var response = await container.CreateItemAsync(customer);
Bir filtrenin (
@id
) eşleştiği öğeleri almak için SQL sorgusuyla adlısql
yeni bir dize oluşturun.string sql = @" SELECT * FROM customers c WHERE c.id = @id ";
Dizeyi
sql
tek sorgu parametresi olarak geçirme adlıquery
yeniQueryDefinition
bir değişken oluşturun. Ayrıca değişken değeriniid
@id
parametreye uygulamak için akışkan yöntemini kullanınWithParameter
.var query = new QueryDefinition( query: sql ) .WithParameter("@id", id);
Azure Cosmos DB'den
GetItemQueryIterator<>
veri alan bir yineleyici oluşturmak için genel yöntemi vequery
değişkenini kullanın. Yineleyiciyi adlıfeed
bir değişkende depolayın. Yineleyiciyi daha sonra atmak için bu ifadenin tamamını bir using deyimine sarmalayın.using var feed = container.GetItemQueryIterator<dynamic>( queryDefinition: query );
Zaman uyumsuz olarak değişkeninin
ReadNextAsync
yöntemini çağırınfeed
ve sonucu adlıresponse
bir değişkende depolayın.var response = await feed.ReadNextAsync();
Değişkenin
response
StatusCode
veRequestCharge
özelliklerinin değerlerini konsola yazın. Değişkenin değeriniid
de yazın.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
CosmosHandler.cs dosyasını kaydedin.
Terminale döndüğünüzde, sql sorgusu kullanarak tek öğeyi okumak için uygulamayı çalıştırın.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Komutun çıkışı, sorgunun birden çok istek birimi (RU) gerektirdiğini göstermelidir.
[OK] mica-pereira 2.82 RUs
CosmosHandler.cs dosyasına geri dönün, ilk iki satır dışındaki tüm kod satırlarını yöntemden
ManageCustomerAsync
yeniden silin.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { Container container = await GetContainerAsync(); string id = name.Kebaberize(); }
Sonraki adımlar için bu kodu yöntemine
ManageCustomerAsync
ekleyin.ve
country
parametrelerini çok parçalı bölüm anahtarı değeri olarak ekleyerekstate
yeni bir örneğiPartitionKeyBuilder
oluşturun.var partitionKey = new PartitionKeyBuilder() .Add(country) .Add(state) .Build();
ve
partitionKey
değişkenlerini kullanarak kapsayıcıdanReadItemAsync<>
öğeyi okumak için kapsayıcınınid
yöntemini kullanın. Sonucu adlıresponse
bir değişkene kaydedin.var response = await container.ReadItemAsync<dynamic>( id: id, partitionKey: partitionKey );
Değişkenin
response
StatusCode
veRequestCharge
özelliklerinin değerlerini konsola yazın. Değişkenin değeriniid
de yazın.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RU");
CosmosHandler.cs dosyasını yeniden kaydedin.
Terminale geri dönüp uygulamayı bir kez daha çalıştırarak tek öğeyi okumasını sağlayın.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Komutun çıkışı, sorgunun tek bir RU gerektirdiğini göstermelidir.
[OK] mica-pereira 1 RUs
SDK kullanarak işlem oluşturma
Son olarak, oluşturduğunuz öğeyi alır, bu öğeyi okur ve .NET için Azure SDK'sını kullanarak tek bir işlemin parçası olarak farklı bir ilgili öğe oluşturursunuz.
CosmosHandler.cs dosyasına dönün veya dosyayı açın.
Yönteminden bu kod satırlarını
ManageCustomerAsync
silin.var response = await container.ReadItemAsync<dynamic>( id: id, partitionKey: partitionKey ); Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
Sonraki adımlar için bu yeni kodu yöntemine
ManageCustomerAsync
ekleyin., ,
state
ve yöntem parametrelerini vecountry
değişkenininame
id
kullanarak yeni bir anonim türlenmiş öğe oluşturun. Öğeyi adlıcustomerCart
bir değişken olarak depolayın. Bu öğe, şu anda boş olan müşteri için gerçek zamanlı bir alışveriş sepetini temsil eder.var customerCart = new { id = $"{Guid.NewGuid()}", customerId = id, items = new string[] {}, address = new { state = state, country = country } };
, ,
state
ve yöntem parametrelerini vecountry
değişkenininame
id
kullanarak anonim olarak yazılan başka bir öğe oluşturun. Öğeyi adlıcustomerCart
bir değişken olarak depolayın. Bu öğe, müşterinin sevkiyat ve iletişim bilgilerini temsil eder.var customerContactInfo = new { id = $"{id}-contact", customerId = id, email = email, location = $"{state}, {country}", address = new { state = state, country = country } };
Değişkenini geçirerek
partitionKey
kapsayıcınınCreateTransactionalBatch
yöntemini kullanarak yeni bir toplu iş oluşturun. Toplu işlemi adlıbatch
bir değişkende depolayın. Aşağıdaki eylemleri gerçekleştirmek için akıcı yöntemleri kullanın:Metot Parametre ReadItem
id
dize değişkeniCreateItem
customerCart
anonim tür değişkeniCreateItem
customerContactInfo
anonim tür değişkenivar batch = container.CreateTransactionalBatch(partitionKey) .ReadItem(id) .CreateItem(customerCart) .CreateItem(customerContactInfo);
İşlemi başlatmak için toplu işlemin
ExecuteAsync
yöntemini kullanın. Sonucu adlıresponse
bir değişkene kaydedin.using var response = await batch.ExecuteAsync();
Değişkenin
response
StatusCode
veRequestCharge
özelliklerinin değerlerini konsola yazın. Değişkenin değeriniid
de yazın.Console.WriteLine($"[{response.StatusCode}]\t{response.RequestCharge} RUs");
CosmosHandler.cs dosyasını yeniden kaydedin.
Terminale geri dönüp uygulamayı bir kez daha çalıştırarak tek öğeyi okumasını sağlayın.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Komutun çıktısı, işlemin tamamı için kullanılan istek birimlerini göstermelidir.
[OK] 16.05 RUs
Not
İstek ücretiniz farklılık gösterebilir.
Veri Gezgini son verileri doğrulama
Öğeleri sarmak için Azure portalındaki Veri Gezgini kullanarak verileri ve bu öğreticide oluşturduğunuz kapsayıcıyı görüntüleyebilirsiniz.
Azure portalında mevcut NoSQL hesabı API'nize gidin.
Kaynak menüsünde Veri Gezgini'ı seçin.
Veri Gezgini sayfasında veritabanını genişletin
cosmicworks
ve kapsayıcıyıcustomers
seçin.Komut çubuğunda Yeni SQL sorgusu'nu seçin.
Sorgu düzenleyicisinde bu SQL sorgu dizesini inceleyin.
SELECT * FROM c
Sorguyu çalıştırmak ve sonuçları gözlemlemek için Sorguyu Yürüt'e tıklayın.
Sonuçlar, bu öğreticide oluşturulan üç öğeye sahip bir JSON dizisi içermelidir. Tüm öğelerin aynı hiyerarşik bölüm anahtarı değerine, ancak benzersiz kimlik alanlarına sahip olduğunu gözlemleyin. Dahil edilen örnek çıktı kısa olması için kesilir.
[ { "id": "mica-pereira", "name": "Mica Pereira", "address": { "state": "Washington", "country": "United States" }, ... }, { "id": "33d03318-6302-4559-b5c0-f3cc643b2f38", "customerId": "mica-pereira", "items": [], "address": { "state": "Washington", "country": "United States" }, ... }, { "id": "mica-pereira-contact", "customerId": "mica-pereira", "email": null, "location": "Washington, United States", "address": { "state": "Washington", "country": "United States" }, ... } ]
Kaynakları temizleme
Artık gerekli olmadığında, bu öğreticide kullanılan veritabanını silin. Bunu yapmak için hesap sayfasına gidin, Veri Gezgini seçin, veritabanını seçin cosmicworks
ve ardından Sil'i seçin.