Självstudie: Utveckla ett .NET-konsolprogram med Azure Cosmos DB för NoSQL
GÄLLER FÖR: NoSQL
Med Azure SDK för .NET kan du lägga till data i ett API för NoSQL-container, antingen asynkrona enskilda åtgärder eller en transaktionsbatch. Den här självstudien går igenom processen för att skapa ett nytt .NET-konsolprogram som lägger till flera objekt i en container.
I den här självstudien lär du dig att:
- Skapa en databas med API för NoSQL
- Skapa ett .NET-konsolprogram och lägg till Azure SDK för .NET
- Lägga till enskilda objekt i ett API för NoSQL-container
- Hämta objekt som är effektiva från ett API för NoSQL-container
- Skapa en transaktion med batchändringar för API:et för NoSQL-containern
Förutsättningar
- Ett befintligt Azure Cosmos DB för NoSQL-konto.
- Om du har en befintlig Azure-prenumeration skapar du ett nytt konto.
- Ingen Azure-prenumeration? Du kan prova Azure Cosmos DB kostnadsfritt utan kreditkort.
- Visual Studio Code
- .NET 8 eller senare
- Erfarenhet av att skriva C#-program.
Skapa API för NoSQL-resurser
Skapa först en tom databas i det befintliga API:et för NoSQL-kontot. Du skapar en container med hjälp av Azure SDK för .NET senare.
Gå till ditt befintliga API för NoSQL-konto i Azure Portal.
I resursmenyn väljer du Nycklar.
På sidan Nycklar observerar och registrerar du värdet för fälten URI och PRIMÄRNYCKEL . Dessa värden används under hela självstudien.
I resursmenyn väljer du Datautforskaren.
På sidan Datautforskaren väljer du alternativet Ny databas i kommandofältet.
I dialogrutan Ny databas skapar du en ny container med följande inställningar:
Värde Databas-ID cosmicworks
Databasdataflödestyp Manuell Databasdataflödesbelopp 400
Välj OK för att skapa databasen.
Skapa .NET-konsolprogram
Nu skapar du ett nytt .NET-konsolprogram och importerar Azure SDK för .NET med hjälp Microsoft.Azure.Cosmos
av biblioteket från NuGet.
Öppna en terminal i en tom katalog.
Skapa ett nytt konsolprogram med den
console
inbyggda mallendotnet new console --langVersion preview
Lägg till 3.31.1-förhandsversionen av
Microsoft.Azure.Cosmos
paketet från NuGet.dotnet add package Microsoft.Azure.Cosmos --version 3.31.1-preview
Lägg också till förhandsversionen av
System.CommandLine
paketet från NuGet.dotnet add package System.CommandLine --prerelease
Lägg också till
Humanizer
paketet från NuGet.dotnet add package Humanizer
Skapa konsolprogramprojektet.
dotnet build
Öppna Visual Studio Code med den aktuella projektmappen som arbetsyta.
Dricks
Du kan köra
code .
i terminalen för att öppna Visual Studio Code och automatiskt öppna arbetskatalogen som den aktuella arbetsytan.Gå till och öppna filen Program.cs . Ta bort all befintlig kod i filen.
Lägg till den här koden i filen för att använda biblioteket System.CommandLine för att parsa kommandoraden för två strängar som skickas via
--first
alternativen och--last
.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);
Kommentar
I den här självstudien är det inte helt viktigt att du förstår hur kommandoradsparsern fungerar. Parsern har fyra alternativ som kan anges när programmet körs. Tre av alternativen krävs eftersom de används för att konstruera ID- och partitionsnyckelfälten.
Nu skapas inte projektet eftersom du inte har definierat den statiska
CosmosHandler.ManageCustomerAsync
metoden ännu.Spara filen Program.cs .
Lägga till objekt i en container med hjälp av SDK
Sedan använder du enskilda åtgärder för att lägga till objekt i API:et för NoSQL-containern. I det här avsnittet definierar CosmosHandler.ManageCustomerAsync
du metoden.
Skapa en ny CosmosHandler.cs fil.
I filen CosmosHandler.cs lägger du till ett nytt användningsdirektiv för namnrymderna
Humanizer
ochMicrosoft.Azure.Cosmos
.using Humanizer; using Microsoft.Azure.Cosmos;
Skapa en ny statisk klass med namnet
CosmosHandler
.public static class CosmosHandler { }
Bara för att verifiera att den här appen fungerar skapar du en kort implementering av den statiska
ManageCustomerAsync
metoden för att skriva ut kommandoradsindata.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { await Console.Out.WriteLineAsync($"Hello {name} of {state}, {country}!"); }
Spara filen CosmosHandler.cs .
Kör programmet i terminalen.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Kommandots utdata bör vara en rolig hälsning.
Hello Mica Pereira of Washington, United States!
Gå tillbaka till filen CosmosHandler.cs .
I den statiska CosmosHandler-klassen lägger du till en ny
private static readonly
medlem av typenCosmosClient
med namnet_client
.private static readonly CosmosClient _client;
Skapa en ny statisk konstruktor för
CosmosHandler
klassen.static CosmosHandler() { }
I konstruktorn skapar du en ny instans av
CosmosClient
klassen som skickar in två strängparametrar med de URI - och PRIMARY KEY-värden som du tidigare registrerade i labbet. Lagra den här nya instansen_client
i medlemmen.static CosmosHandler() { _client = new CosmosClient( accountEndpoint: "<uri>", authKeyOrResourceToken: "<primary-key>" ); }
Tillbaka i den statiska CosmosHandler-klassen skapar du en ny asynkron metod med namnet
GetContainerAsync
som returnerar enContainer
.private static async Task<Container> GetContainerAsync() { }
Lägg till den här koden i metoden för
GetContainerAsync
nästa steg.cosmicworks
Hämta databasen och lagra den i en variabel med namnetdatabase
.Database database = _client.GetDatabase("cosmicworks");
Skapa ett nytt generiskt
List<>
string
värde i en lista över hierarkiska partitionsnyckelsökvägar och lagra den i en variabel med namnetkeyPaths
.List<string> keyPaths = new() { "/address/country", "/address/state" };
Skapa en ny
ContainerProperties
variabel med namnet på containern (customers
) och listan över partitionsnyckelsökvägar.ContainerProperties properties = new( id: "customers", partitionKeyPaths: keyPaths );
CreateContainerIfNotExistsAsync
Använd metoden för att ange containeregenskaperna och hämta containern. Den här metoden skapar, per namn, containern asynkront om den inte redan finns i databasen. Returnera resultatet som utdata förGetContainerAsync
metoden.return await database.CreateContainerIfNotExistsAsync( containerProperties: properties );
Ta bort all kod i
ManageCustomerAsync
metoden.Lägg till den här koden i metoden för
ManageCustomerAsync
nästa steg.Anropa
GetContainerAsync
metoden asynkront och lagra resultatet i en variabel med namnetcontainer
.Container container = await GetContainerAsync();
Skapa en ny variabel med namnet
id
som använderKebaberize
metoden från Humanizer för att transformera metodparameternname
.string id = name.Kebaberize();
Kommentar
Metoden
Kebaberize
ersätter alla blanksteg med bindestreck och sammanfogar texten till gemener.Skapa ett nytt anonymt skrivobjekt med hjälp av parametrarna
name
,state
ochcountry
-metoden och variabelnid
. Lagra objektet som en variabel med namnetcustomer
.var customer = new { id = id, name = name, address = new { state = state, country = country } };
Använd containerns asynkrona
CreateItemAsync
metod för att skapa ett nytt objekt i containern och tilldela HTTP-svarsmetadata till en variabel med namnetresponse
.var response = await container.CreateItemAsync(customer);
Skriv värdena för variabelns
response
StatusCode
ochRequestCharge
egenskaperna till konsolen. Skriv även värdet för variabelnid
.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
Spara filen CosmosHandler.cs .
Kör programmet igen i terminalen.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Kommandots utdata bör innehålla en status- och begärandeavgift för åtgärden.
[Created] mica-pereira 7.05 RUs
Kommentar
Din begärandeavgift kan variera.
Kör programmet en gång till.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Den här gången bör programmet krascha. Om du bläddrar igenom felmeddelandet ser du att kraschen inträffade på grund av en konflikt i den unika identifieraren för objekten.
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." ] );
Hämta ett objekt med hjälp av SDK
Nu när du har skapat ditt första objekt i containern kan du använda samma SDK för att hämta objektet. Här frågar och pekar du på objektet för att jämföra skillnaden i RU-förbrukning (request unit).
Gå tillbaka till eller öppna filen CosmosHandler.cs .
Ta bort alla kodrader från
ManageCustomerAsync
metoden förutom de två första raderna.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { Container container = await GetContainerAsync(); string id = name.Kebaberize(); }
Lägg till den här koden i metoden för
ManageCustomerAsync
nästa steg.Använd containerns asynkrona
CreateItemAsync
metod för att skapa ett nytt objekt i containern och tilldela HTTP-svarsmetadata till en variabel med namnetresponse
.var response = await container.CreateItemAsync(customer);
Skapa en ny sträng med namnet
sql
med en SQL-fråga för att hämta objekt där ett filter (@id
) matchar.string sql = @" SELECT * FROM customers c WHERE c.id = @id ";
Skapa en ny
QueryDefinition
variabel med namnetquery
som skickar in strängensql
som den enda frågeparametern.WithParameter
Använd även vätskemetoden för att tillämpa värdet för variabelnid
på parametern@id
.var query = new QueryDefinition( query: sql ) .WithParameter("@id", id);
Använd den
GetItemQueryIterator<>
allmänna metoden och variabelnquery
för att skapa en iterator som hämtar data från Azure Cosmos DB. Lagra iteratorn i en variabel med namnetfeed
. Omslut hela uttrycket i en using-instruktion för att ta bort iteratorn senare.using var feed = container.GetItemQueryIterator<dynamic>( queryDefinition: query );
Anropa
ReadNextAsync
metoden för variabelnfeed
asynkront och lagra resultatet i en variabel med namnetresponse
.var response = await feed.ReadNextAsync();
Skriv värdena för variabelns
response
StatusCode
ochRequestCharge
egenskaperna till konsolen. Skriv även värdet för variabelnid
.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
Spara filen CosmosHandler.cs .
Tillbaka i terminalen kör du programmet för att läsa det enskilda objektet med hjälp av en SQL-fråga.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Utdata från kommandot bör indikera att frågan krävde flera enheter för begäran (RU:er).
[OK] mica-pereira 2.82 RUs
Tillbaka i filen CosmosHandler.cs tar du bort alla kodrader från
ManageCustomerAsync
metoden igen förutom de två första raderna.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { Container container = await GetContainerAsync(); string id = name.Kebaberize(); }
Lägg till den här koden i metoden för
ManageCustomerAsync
nästa steg.Skapa en ny instans av
PartitionKeyBuilder
genom att lägga till parametrarnastate
ochcountry
som ett partitionsnyckelvärde i flera delar.var partitionKey = new PartitionKeyBuilder() .Add(country) .Add(state) .Build();
Använd containerns
ReadItemAsync<>
metod för att peka på att läsa objektet från containern med hjälp av variablernaid
ochpartitionKey
. Spara resultatet i en variabel med namnetresponse
.var response = await container.ReadItemAsync<dynamic>( id: id, partitionKey: partitionKey );
Skriv värdena för variabelns
response
StatusCode
ochRequestCharge
egenskaperna till konsolen. Skriv även värdet för variabelnid
.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RU");
Spara filen CosmosHandler.cs igen.
Tillbaka i terminalen kör du programmet en gång till för att peka på att läsa det enskilda objektet.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Utdata från kommandot bör indikera att frågan krävde en enskild RU.
[OK] mica-pereira 1 RUs
Skapa en transaktion med hjälp av SDK
Slutligen tar du det objekt som du skapade, läser det objektet och skapar ett annat relaterat objekt som en del av en enda transaktion med hjälp av Azure SDK för .NET.
Gå tillbaka till eller öppna filen CosmosHandler.cs .
Ta bort dessa kodrader från
ManageCustomerAsync
metoden.var response = await container.ReadItemAsync<dynamic>( id: id, partitionKey: partitionKey ); Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
Lägg till den nya koden i
ManageCustomerAsync
metoden för nästa steg.Skapa ett nytt anonymt skrivobjekt med hjälp av parametrarna
name
,state
ochcountry
-metoden och variabelnid
. Lagra objektet som en variabel med namnetcustomerCart
. Det här objektet representerar en kundvagn i realtid för kunden som för närvarande är tom.var customerCart = new { id = $"{Guid.NewGuid()}", customerId = id, items = new string[] {}, address = new { state = state, country = country } };
Skapa ett annat anonymt skrivet objekt med hjälp av parametrarna
name
,state
ochcountry
-metoden och variabelnid
. Lagra objektet som en variabel med namnetcustomerCart
. Det här objektet representerar leverans- och kontaktinformation för kunden.var customerContactInfo = new { id = $"{id}-contact", customerId = id, email = email, location = $"{state}, {country}", address = new { state = state, country = country } };
Skapa en ny batch med hjälp av containerns
CreateTransactionalBatch
metod som skickar in variabelnpartitionKey
. Lagra batchen i en variabel med namnetbatch
. Använd fluent-metoder för att utföra följande åtgärder:Metod Parameter ReadItem
id
strängvariabelCreateItem
customerCart
variabel för anonym typCreateItem
customerContactInfo
variabel för anonym typvar batch = container.CreateTransactionalBatch(partitionKey) .ReadItem(id) .CreateItem(customerCart) .CreateItem(customerContactInfo);
Använd batchmetoden
ExecuteAsync
för att starta transaktionen. Spara resultatet i en variabel med namnetresponse
.using var response = await batch.ExecuteAsync();
Skriv värdena för variabelns
response
StatusCode
ochRequestCharge
egenskaperna till konsolen. Skriv även värdet för variabelnid
.Console.WriteLine($"[{response.StatusCode}]\t{response.RequestCharge} RUs");
Spara filen CosmosHandler.cs igen.
Tillbaka i terminalen kör du programmet en gång till för att peka på att läsa det enskilda objektet.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Utdata från kommandot ska visa de enheter för begäran som används för hela transaktionen.
[OK] 16.05 RUs
Kommentar
Din begärandeavgift kan variera.
Verifiera de slutliga data i Datautforskaren
Om du vill avsluta saker använder du Datautforskaren i Azure Portal för att visa data och containern som du skapade i den här självstudien.
Gå till ditt befintliga API för NoSQL-konto i Azure Portal.
I resursmenyn väljer du Datautforskaren.
På sidan Datautforskaren expanderar du
cosmicworks
databasen och väljer sedan containerncustomers
.I kommandofältet väljer du Ny SQL-fråga.
Observera den här SQL-frågesträngen i frågeredigeraren.
SELECT * FROM c
Välj Kör fråga för att köra frågan och observera resultatet.
Resultatet bör innehålla en JSON-matris med tre objekt som skapats i den här självstudien. Observera att alla objekt har samma hierarkiska partitionsnyckelvärde, men unika ID-fält. Exempelutdata som ingår trunkeras för korthet.
[ { "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" }, ... } ]
Rensa resurser
Ta bort databasen som används i den här självstudien när den inte längre behövs. Det gör du genom att gå till kontosidan, välja Datautforskarencosmicworks
, välja databasen och sedan ta bort.