Oktatóanyag: .NET-konzolalkalmazás fejlesztése a NoSQL-hez készült Azure Cosmos DB-vel
A KÖVETKEZŐRE VONATKOZIK: NoSQL
A .NET-hez készült Azure SDK lehetővé teszi adatok hozzáadását egy API for NoSQL-tárolóhoz, akár aszinkron egyéni műveletekhez, akár tranzakciós kötegekhez. Ez az oktatóanyag végigvezeti egy új .NET-konzolalkalmazás létrehozásának folyamatán, amely több elemet ad hozzá egy tárolóhoz.
Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:
- Adatbázis létrehozása a NoSQL-hez készült API használatával
- .NET-konzolalkalmazás létrehozása és az Azure SDK hozzáadása a .NET-hez
- Egyéni elemek hozzáadása egy API for NoSQL-tárolóhoz
- Elemek hatékony lekérése egy API for NoSQL-tárolóból
- Tranzakció létrehozása kötegmódosításokkal a NoSQL-tároló API-hoz
Előfeltételek
- Egy meglévő Azure Cosmos DB for NoSQL-fiók.
- Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy új fiókot.
- Nincs Azure-előfizetés? Ingyenesen kipróbálhatja az Azure Cosmos DB-t hitelkártya nélkül.
- Visual Studio Code
- .NET 8 vagy újabb
- C#-alkalmazások írásának tapasztalata.
API létrehozása NoSQL-erőforrásokhoz
Először hozzon létre egy üres adatbázist a Meglévő API for NoSQL-fiókban. Egy tárolót később az Azure SDK for .NET használatával hozhat létre.
Nyissa meg a meglévő API for NoSQL-fiókját az Azure Portalon.
Az erőforrás menüjében válassza a Kulcsok lehetőséget.
A Kulcsok lapon figyelje meg és rögzítse az URI és az ELSŐDLEGES KULCS mezők értékét. Ezeket az értékeket az oktatóanyag során használjuk.
Az erőforrásmenüben válassza az Adatkezelő lehetőséget.
Az Adatkezelő lapon válassza az Új adatbázis lehetőséget a parancssávon.
Az Új adatbázis párbeszédpanelen hozzon létre egy új tárolót a következő beállításokkal:
Érték Adatbázis azonosítója cosmicworks
Adatbázis átviteli sebességének típusa Kézi Adatbázis átviteli sebességének mennyisége 400
Az adatbázis létrehozásához kattintson az OK gombra .
.NET-konzolalkalmazás létrehozása
Most hozzon létre egy új .NET-konzolalkalmazást, és importálja a .NET-hez készült Azure SDK-t a Microsoft.Azure.Cosmos
NuGet könyvtárával.
Nyisson meg egy terminált egy üres könyvtárban.
Új konzolalkalmazás létrehozása a
console
beépített sablonnaldotnet new console --langVersion preview
Adja hozzá a csomag 3.31.1-es előzetes verzióját a
Microsoft.Azure.Cosmos
NuGetből.dotnet add package Microsoft.Azure.Cosmos --version 3.31.1-preview
Emellett adja hozzá a csomag előzetes verzióját a
System.CommandLine
NuGetből.dotnet add package System.CommandLine --prerelease
Emellett vegye fel a csomagot a
Humanizer
NuGetből.dotnet add package Humanizer
Hozza létre a konzolalkalmazás-projektet.
dotnet build
Nyissa meg a Visual Studio Code-ot az aktuális projektmappával munkaterületként.
Tipp.
A terminálon futtatva
code .
megnyithatja a Visual Studio Code-ot, és automatikusan megnyithatja a munkakönyvtárat aktuális munkaterületként.Nyissa meg és nyissa meg a Program.cs fájlt. Törölje a fájl összes meglévő kódját.
Adja hozzá ezt a kódot a fájlhoz, hogy a System.CommandLine kódtár használatával elemezhesse a parancssort a megadott és
--last
a beállítások között--first
átadott két sztringhez.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);
Feljegyzés
Ebben az oktatóanyagban nem teljesen fontos, hogy megértse a parancssori elemző működését. Az elemző négy lehetőséggel rendelkezik, amelyek az alkalmazás futtatásakor adhatók meg. Három lehetőségre van szükség, mivel az azonosító és a partíciókulcs mezőinek létrehozására lesznek használva.
Ezen a ponton a projekt nem fog létrejönni, mivel még nem definiálta a statikus
CosmosHandler.ManageCustomerAsync
metódust.Mentse a Program.cs fájlt.
Elemek hozzáadása tárolóhoz az SDK használatával
Ezután egyéni műveletekkel adhat hozzá elemeket az API for NoSQL-tárolóhoz. Ebben a szakaszban definiálja a metódust CosmosHandler.ManageCustomerAsync
.
Hozzon létre egy új CosmosHandler.cs fájlt.
A CosmosHandler.cs fájlban adjon hozzá egy új, a névterekre és
Microsoft.Azure.Cosmos
névterekreHumanizer
vonatkozó irányelvet.using Humanizer; using Microsoft.Azure.Cosmos;
Hozzon létre egy új statikus osztályt .
CosmosHandler
public static class CosmosHandler { }
Az alkalmazás működésének ellenőrzéséhez hozza létre a statikus
ManageCustomerAsync
metódus rövid implementációját a parancssori bemenet nyomtatásához.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { await Console.Out.WriteLineAsync($"Hello {name} of {state}, {country}!"); }
Mentse a CosmosHandler.cs fájlt.
Futtassa az alkalmazást a terminálban.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
A parancs kimenetének szórakoztató üdvözlésnek kell lennie.
Hello Mica Pereira of Washington, United States!
Térjen vissza a CosmosHandler.cs fájlhoz.
A statikus CosmosHandler osztályban adjon hozzá egy új
private static readonly
, névvel ellátott tagotCosmosClient
_client
.private static readonly CosmosClient _client;
Hozzon létre egy új statikus konstruktort az
CosmosHandler
osztályhoz.static CosmosHandler() { }
A konstruktoron belül hozzon létre egy új példányt az
CosmosClient
osztálynak, amely két sztringparaméterben halad át a laborban korábban rögzített URI - és ELSŐDLEGESKULCS-értékekkel . Tárolja ezt az új példányt a_client
tagban.static CosmosHandler() { _client = new CosmosClient( accountEndpoint: "<uri>", authKeyOrResourceToken: "<primary-key>" ); }
A statikus CosmosHandler osztályban hozzon létre egy új aszinkron metódust
GetContainerAsync
, amely egyContainer
.private static async Task<Container> GetContainerAsync() { }
A következő lépésekhez adja hozzá ezt a kódot a metódushoz
GetContainerAsync
.Kérje le az adatbázist
cosmicworks
, és tárolja egy nevűdatabase
változóban.Database database = _client.GetDatabase("cosmicworks");
Hozzon létre egy új általános
List<>
string
értéket a hierarchikus partíciókulcs elérési útjainak listájában, és tárolja egy nevesítettkeyPaths
változóban.List<string> keyPaths = new() { "/address/country", "/address/state" };
Hozzon létre egy új
ContainerProperties
változót a tároló (customers
) nevével és a partíciókulcs elérési útjainak listájával.ContainerProperties properties = new( id: "customers", partitionKeyPaths: keyPaths );
A metódussal
CreateContainerIfNotExistsAsync
adja meg a tároló tulajdonságait, és kérje le a tárolót. Ez a metódus név szerint aszinkron módon hozza létre a tárolót, ha még nem létezik az adatbázisban. Adja vissza az eredményt a metódus kimenetekéntGetContainerAsync
.return await database.CreateContainerIfNotExistsAsync( containerProperties: properties );
Törölje az összes kódot a metóduson
ManageCustomerAsync
belül.A következő lépésekhez adja hozzá ezt a kódot a metódushoz
ManageCustomerAsync
.Aszinkron módon hívja meg a metódust
GetContainerAsync
, és tárolja az eredményt egy nevesítettcontainer
változóban.Container container = await GetContainerAsync();
Hozzon létre egy új változót
id
, amely aKebaberize
Humanizer metódusát használja aname
metódusparaméter átalakításához.string id = name.Kebaberize();
Feljegyzés
A
Kebaberize
metódus az összes szóközt kötőjelekre cseréli, és kisbetűsre konvergálja a szöveget.Hozzon létre egy új névtelen típusú elemet a
name
,state
, éscountry
metódusparaméterek és aid
változó használatával. Tárolja az elemet egy névvel ellátottcustomer
változóként.var customer = new { id = id, name = name, address = new { state = state, country = country } };
A tároló aszinkron metódusával hozzon
CreateItemAsync
létre egy új elemet a tárolóban, és rendelje hozzá a HTTP-válasz metaadatait egy nevűresponse
változóhoz.var response = await container.CreateItemAsync(customer);
Írja be a változó
StatusCode
ésRequestCharge
aresponse
tulajdonságok értékeit a konzolra. Írja meg a változó értékétid
is.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
Mentse a CosmosHandler.cs fájlt.
Futtassa újra az alkalmazást a terminálban.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
A parancs kimenetének tartalmaznia kell a művelet állapotát és a kérelem díját.
[Created] mica-pereira 7.05 RUs
Feljegyzés
A kérelem díja eltérő lehet.
Futtassa még egyszer az alkalmazást.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
Ezúttal a program összeomlik. Ha végiggörget a hibaüzeneten, láthatja, hogy az összeomlás az elemek egyedi azonosítójában lévő ütközés miatt történt.
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." ] );
Elem lekérése az SDK használatával
Most, hogy létrehozta az első elemet a tárolóban, ugyanazt az SDK-t használhatja az elem lekéréséhez. Itt lekérdezi és felolvassa az elemet, hogy összehasonlítsa a kérelemegységek (RU) fogyasztásának különbségét.
Térjen vissza vagy nyissa meg a CosmosHandler.cs fájlt.
Törölje a metódus összes kódsorát az
ManageCustomerAsync
első két sor kivételével.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { Container container = await GetContainerAsync(); string id = name.Kebaberize(); }
A következő lépésekhez adja hozzá ezt a kódot a metódushoz
ManageCustomerAsync
.A tároló aszinkron metódusával hozzon
CreateItemAsync
létre egy új elemet a tárolóban, és rendelje hozzá a HTTP-válasz metaadatait egy nevűresponse
változóhoz.var response = await container.CreateItemAsync(customer);
Hozzon létre egy SQL-lekérdezéssel elnevezett
sql
új sztringet az olyan elemek lekéréséhez, amelyekben egy szűrő (@id
) egyezik.string sql = @" SELECT * FROM customers c WHERE c.id = @id ";
Hozzon létre egy új
QueryDefinition
változót, amelyquery
a sztringben lesz azsql
egyetlen lekérdezési paraméter. Emellett aWithParameter
folyadékmetódus használatával alkalmazza a változóid
értékét a@id
paraméterre.var query = new QueryDefinition( query: sql ) .WithParameter("@id", id);
GetItemQueryIterator<>
Az általános módszer és aquery
változó használatával hozzon létre egy iterátort, amely adatokat kap az Azure Cosmos DB-ből. Tárolja az iterátort egy nevesítettfeed
változóban. Az iterátor későbbi elidegenítéséhez csomagolja be ezt a teljes kifejezést egy használandó utasításba.using var feed = container.GetItemQueryIterator<dynamic>( queryDefinition: query );
Aszinkron módon hívja meg a
ReadNextAsync
változó metódusátfeed
, és tárolja az eredményt egy nevesítettresponse
változóban.var response = await feed.ReadNextAsync();
Írja be a változó
StatusCode
ésRequestCharge
aresponse
tulajdonságok értékeit a konzolra. Írja meg a változó értékétid
is.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
Mentse a CosmosHandler.cs fájlt.
Futtassa az alkalmazást a terminálban az egyetlen elem SQL-lekérdezéssel való olvasásához.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
A parancs kimenetének azt kell jeleznie, hogy a lekérdezéshez több kérelemegységre (KÉRELEM) volt szükség.
[OK] mica-pereira 2.82 RUs
A CosmosHandler.cs fájlban törölje ismét a metódus összes kódsorát,
ManageCustomerAsync
kivéve az első két sort.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { Container container = await GetContainerAsync(); string id = name.Kebaberize(); }
A következő lépésekhez adja hozzá ezt a kódot a metódushoz
ManageCustomerAsync
.Hozzon létre egy új példányt
PartitionKeyBuilder
úgy, hogy többrészes partíciókulcs-értékként adja hozzá a paramétereket éscountry
astate
paramétereket.var partitionKey = new PartitionKeyBuilder() .Add(country) .Add(state) .Build();
A tároló metódusával
ReadItemAsync<>
pontozza az elemet a tárolóból a változók éspartitionKey
aid
változók használatával. Mentse az eredményt egy névvel ellátottresponse
változóba.var response = await container.ReadItemAsync<dynamic>( id: id, partitionKey: partitionKey );
Írja be a változó
StatusCode
ésRequestCharge
aresponse
tulajdonságok értékeit a konzolra. Írja meg a változó értékétid
is.Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RU");
Mentse ismét a CosmosHandler.cs fájlt.
A terminálban futtassa még egyszer az alkalmazást, hogy az egyetlen elem olvasására mutasson.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
A parancs kimenetének azt kell jeleznie, hogy a lekérdezéshez egyetlen ru szükséges.
[OK] mica-pereira 1 RUs
Tranzakció létrehozása az SDK használatával
Végül a létrehozott elemet beolvassa, és egy másik kapcsolódó elemet hoz létre egyetlen tranzakció részeként a .NET-hez készült Azure SDK használatával.
Térjen vissza vagy nyissa meg a CosmosHandler.cs fájlt.
Törölje ezeket a kódsorokat a
ManageCustomerAsync
metódusból.var response = await container.ReadItemAsync<dynamic>( id: id, partitionKey: partitionKey ); Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
A következő lépésekhez adja hozzá ezt az új kódot a metódushoz
ManageCustomerAsync
.Hozzon létre egy új névtelen típusú elemet a
name
,state
, éscountry
metódusparaméterek és aid
változó használatával. Tárolja az elemet egy névvel ellátottcustomerCart
változóként. Ez az elem egy valós idejű bevásárlókocsit jelöl az aktuálisan üres ügyfél számára.var customerCart = new { id = $"{Guid.NewGuid()}", customerId = id, items = new string[] {}, address = new { state = state, country = country } };
Hozzon létre egy új névtelen típusú elemet a
name
,state
, és metódusparaméterek éscountry
aid
változó használatával. Tárolja az elemet egy névvel ellátottcustomerCart
változóként. Ez az elem az ügyfél szállítási és kapcsolattartási adatait jelöli.var customerContactInfo = new { id = $"{id}-contact", customerId = id, email = email, location = $"{state}, {country}", address = new { state = state, country = country } };
Hozzon létre egy új köteget a változóban
partitionKey
átadott tároló metódusávalCreateTransactionalBatch
. Tárolja a köteget egy nevesítettbatch
változóban. A fluent metódusokkal hajtsa végre a következő műveleteket:Metódus Paraméter ReadItem
id
sztringváltozóCreateItem
customerCart
névtelen típusváltozóCreateItem
customerContactInfo
névtelen típusváltozóvar batch = container.CreateTransactionalBatch(partitionKey) .ReadItem(id) .CreateItem(customerCart) .CreateItem(customerContactInfo);
A tranzakció elindításához használja a köteg
ExecuteAsync
metódusát. Mentse az eredményt egy névvel ellátottresponse
változóba.using var response = await batch.ExecuteAsync();
Írja be a változó
StatusCode
ésRequestCharge
aresponse
tulajdonságok értékeit a konzolra. Írja meg a változó értékétid
is.Console.WriteLine($"[{response.StatusCode}]\t{response.RequestCharge} RUs");
Mentse ismét a CosmosHandler.cs fájlt.
A terminálban futtassa még egyszer az alkalmazást, hogy az egyetlen elem olvasására mutasson.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
A parancs kimenetének a teljes tranzakcióhoz használt kérelemegységeket kell megjelenítenie.
[OK] 16.05 RUs
Feljegyzés
A kérelem díja eltérő lehet.
A végleges adatok ellenőrzése az Adatkezelőben
A dolgok burkolásához az Azure Portal Adatkezelője segítségével tekintheti meg az ebben az oktatóanyagban létrehozott adatokat és tárolót.
Nyissa meg a meglévő API for NoSQL-fiókját az Azure Portalon.
Az erőforrásmenüben válassza az Adatkezelő lehetőséget.
Az Adatkezelő lapon bontsa ki az adatbázist
cosmicworks
, majd válassza ki a tárolótcustomers
.A parancssávon válassza az Új SQL-lekérdezés lehetőséget.
A lekérdezésszerkesztőben figyelje meg ezt az SQL-lekérdezési sztringet.
SELECT * FROM c
Válassza a Lekérdezés végrehajtása lehetőséget a lekérdezés futtatásához és az eredmények megfigyeléséhez.
Az eredményeknek tartalmazniuk kell egy JSON-tömböt, amely három elemet tartalmaz ebben az oktatóanyagban. Figyelje meg, hogy az összes elem azonos hierarchikus partíciókulcs-értékkel, de egyedi azonosítómezővel rendelkezik. A példakimenet a rövidség kedvéért csonkolt.
[ { "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" }, ... } ]
Az erőforrások eltávolítása
Ha már nincs rá szükség, törölje az oktatóanyagban használt adatbázist. Ehhez lépjen a fiók lapjára, válassza az Adatkezelőt, jelölje ki az adatbázist, majd válassza a cosmicworks
Törlés lehetőséget.