Oefening: EF Core toevoegen aan minimale API
U bent een ontwikkelaar voor een bedrijf en u en uw bedrijf hebben gehoord over de nieuwe minimale API. Uw manager heeft u gevraagd een project voor het project te maken, zodat u kunt bespreken of u het wilt gebruiken voor uw volgende project.
Notitie
Deze module maakt gebruik van de .NET CLI (Opdrachtregelinterface) en Visual Studio Code voor lokale ontwikkeling. Nadat u deze module hebt voltooid, kunt u de concepten toepassen met Behulp van Visual Studio (Windows), Visual Studio voor Mac (macOS) of verdere ontwikkeling met behulp van Visual Studio Code (Windows, Linux, & macOS).
In deze module wordt de .NET 8.0 SDK gebruikt. Zorg ervoor dat .NET 8.0 is geïnstalleerd door de volgende opdracht uit te voeren in de opdrachtterminal van uw voorkeur:
dotnet --list-sdks
Uitvoer die vergelijkbaar is met het volgende voorbeeld wordt weergegeven:
6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]
Zorg ervoor dat een versie die begint met 8 wordt vermeld. Als er geen wordt vermeld of de opdracht niet wordt gevonden, installeert u de meest recente .NET 8.0 SDK.
Het project instellen
Eerst moet u een project maken. U hebt .NET 6 geïnstalleerd en u kunt aan de slag. In deze les voegt u gegevenspersistentie toe aan een pizzabeheer-API.
Maak in een terminal een web-API door
dotnet newuit te voeren:dotnet new web -o PizzaStore -f net8.0U moet de directory PizzaStore zien.
Ga naar de PizzaStore-directory door de volgende opdracht in te voeren:
cd PizzaStoreInstalleer het Swashbuckle-pakket:
dotnet add package Swashbuckle.AspNetCore --version 6.5.0Open het project in Visual Studio Code.
Maak met Visual Studio Code een Pizza.cs-bestand in de hoofdmap van het project en geef het bestand de volgende inhoud:
namespace PizzaStore.Models { public class Pizza { public int Id { get; set; } public string? Name { get; set; } public string? Description { get; set; } } }De voorgaande
Pizzaklasse is een eenvoudig object dat een pizza vertegenwoordigt. Deze code is uw gegevensmodel. Later gebruikt u Entity Framework (EF) Core om dit gegevensmodel toe te wijzen aan een databasetabel.Open Program.cs en voeg de gemarkeerde code toe:
using Microsoft.OpenApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "PizzaStore API", Description = "Making the Pizzas you love", Version = "v1" }); }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "PizzaStore API V1"); }); } app.MapGet("/", () => "Hello World!"); app.Run();Mogelijk ontvangt u een prompt van Visual Studio Code om assets toe te voegen om fouten in het project op te sporen. Selecteer
Yesin het dialoogvenster.
EF Core toevoegen aan het project
Als u de items in de lijst to-do wilt opslaan, installeert u het EntityFrameworkCore.InMemory-pakket.
Druk op Ctrl+' om een terminal te openen in Visual Studio Code. Voer in de nieuwe terminal de volgende code in om het EF Core InMemory-pakket toe te voegen:
dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 8.0Voeg
using Microsoft.EntityFrameworkCore;toe aan het begin van uw Program.cs - en Pizza.cs-bestanden .Nu u EF Core aan het project hebt toegevoegd, kunt u uw code koppelen aan de gegevens die u wilt opslaan en er query's op uitvoeren. Als u deze stap wilt uitvoeren, maakt u een
PizzaDb-klasse. DePizzaDb-klasse voert de volgende taken uit:- Stel uw
Pizzas-eigenschap beschikbaar uit uw lijst metPizzain de database. - Gebruik
UseInMemoryDatabaseom de in-memory databaseopslag te verbinden. Uw gegevens worden hier opgeslagen zolang de app wordt uitgevoerd.
- Stel uw
Als u uw in-memory database wilt instellen, voegt u de volgende code toe aan de onderkant van het Pizza.cs-bestand (boven de laatste
}). U hebt twee klassedefinities in dePizzaStore.Modelsnaamruimte.class PizzaDb : DbContext { public PizzaDb(DbContextOptions options) : base(options) { } public DbSet<Pizza> Pizzas { get; set; } = null!; }DbContextvertegenwoordigt een verbinding of sessie die wordt gebruikt om exemplaren van entiteiten in een database op te vragen en op te slaan.Voeg
using PizzaStore.Models;toe aan het begin van het Program.cs-bestand .Voeg in Program.cs, vóór de aanroep naar
AddSwaggerGen, de volgende code toe:builder.Services.AddDbContext<PizzaDb>(options => options.UseInMemoryDatabase("items"));
Een lijst met items retourneren
Als u wilt lezen uit een lijst met items in de pizzalijst, voegt u de volgende code toe boven de aanroep van
app.Run();om een route '/pizzas' toe te voegen:app.MapGet("/pizzas", async (PizzaDb db) => await db.Pizzas.ToListAsync());
De toepassing uitvoeren
Zorg ervoor dat u al uw wijzigingen hebt opgeslagen. Voer de app uit door
dotnet runaan te roepen in de terminal. Met deze actie wordt de app gebouwd en gehost op een poort van 5000-5300. HTTPS heeft een poort geselecteerd in het bereik 7000-7300.Notitie
Als u het gedrag van willekeurige poortselectie wilt overschrijven, kunt u instellen dat de poorten worden gebruikt in launchSettings.json.
dotnet runHier ziet u hoe de uitvoer eruit kan zien in de terminal:
Building... info: Microsoft.Hosting.Lifetime[14] Now listening on: https://localhost:7200 info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5100 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] Content root path: /<path>/PizzaStoreGa in uw browser naar https://localhost:{PORT}/swagger. Selecteer de knop
GET /pizzas, gevolgd door uitproberen en uitvoeren. U ziet dat de lijst leeg is onderResponse body.Druk in de terminal op Ctrl+C om het programma niet meer uit te voeren.
Nieuwe items maken
Laten we de code toevoegen aan POST nieuwe items in de lijst met pizza's. Voeg in Program.cs de volgende code toe onder de app.MapGet code die u eerder hebt gemaakt.
app.MapPost("/pizza", async (PizzaDb db, Pizza pizza) =>
{
await db.Pizzas.AddAsync(pizza);
await db.SaveChangesAsync();
return Results.Created($"/pizza/{pizza.Id}", pizza);
});
De API testen
Zorg ervoor dat u al uw wijzigingen hebt opgeslagen en voer de app opnieuw uit. Ga terug naar de Swagger-gebruikersinterface en nu ziet u POST/pizza. Nieuwe items toevoegen aan de pizzalijst:
Selecteer POST /pizza.
Selecteer Uitproberen.
Vervang de aanvraagbody door de volgende JSON:
{ "name": "Pepperoni", "description": "A classic pepperoni pizza" }Selecteer Uitvoeren.
Om de items in de lijst te lezen:
Kies GET /pizza's.
Selecteer Uitproberen.
Selecteer Uitvoeren.
De
Response bodybevat de items die zojuist zijn toegevoegd.[ { "id": 1, "name": "Pepperoni", "description": "A classic pepperoni pizza" } ]Druk op Ctrl+C in de terminal om te stoppen met het uitvoeren van de app. Gedurende de rest van deze oefening start en stopt u de app opnieuw wanneer u dit wenst om uw wijzigingen te testen. Zorg ervoor dat u al uw wijzigingen opslaat voordat u
dotnet run!
Eén item ophalen
Als u een item bij idwilt ophalen, voegt u de code toe onder de app.MapPost route die u eerder hebt gemaakt.
app.MapGet("/pizza/{id}", async (PizzaDb db, int id) => await db.Pizzas.FindAsync(id));
GET testen op id
Als u deze bewerking wilt testen, gaat u naar https://localhost:{PORT}/pizza/1 of gebruikt u de Swagger-gebruikersinterface. Omdat u een in-memory database gebruikt, wordt de pizza die u eerder hebt gemaakt, niet weergegeven als u de toepassing opnieuw hebt opgestart. U moet de POST-bewerking dus gebruiken om deze opnieuw toe te voegen.
Een item bijwerken
Als u een bestaand item wilt bijwerken, voegt u de code toe onder de GET /pizza/{id} route die u hebt gemaakt:
app.MapPut("/pizza/{id}", async (PizzaDb db, Pizza updatepizza, int id) =>
{
var pizza = await db.Pizzas.FindAsync(id);
if (pizza is null) return Results.NotFound();
pizza.Name = updatepizza.Name;
pizza.Description = updatepizza.Description;
await db.SaveChangesAsync();
return Results.NoContent();
});
Test PUT
Selecteer PUT /pizza/{id} in de Swagger UI.
Selecteer Uitproberen.
Voer in het tekstvak id1 in.
Werk ten slotte
Request bodybij. Plak de volgende JSON en wijzignameinPineapple.{ "id": 1, "name": "Pineapple" }Selecteer Uitvoeren.
Als u de code wilt testen, schuift u terug naar GET /pizza/{id}. De pizza heeft nu de naam Pineapple.
Een item verwijderen
Als u een bestaand item wilt verwijderen, voegt u de code toe onder PUT /pizza/{id} die u eerder hebt gemaakt:
app.MapDelete("/pizza/{id}", async (PizzaDb db, int id) =>
{
var pizza = await db.Pizzas.FindAsync(id);
if (pizza is null)
{
return Results.NotFound();
}
db.Pizzas.Remove(pizza);
await db.SaveChangesAsync();
return Results.Ok();
});
Het DELETE-proces testen
Probeer nu een item te verwijderen met behulp van de Swagger-interface.
In deze les hebt u EF Core toegevoegd aan een bestaande minimale API-toepassing en een in-memory database gebruikt om de gegevens op te slaan. Vervolgens leert u hoe u een echte database gebruikt om de gegevens op te slaan, zodat deze bewaard blijft tussen het afsluiten van applicaties.