Oefening: EF Core toevoegen aan minimale API

Voltooid

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 continue ontwikkeling met behulp van Visual Studio Code (Windows, Linux en 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 er een versie wordt vermeld die begint met 8 . 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.

  1. Maak in een terminal een web-API door het volgende uit te voeren dotnet new:

    dotnet new web -o PizzaStore -f net8.0
    

    U ziet nu de map PizzaStore .

  2. Ga naar de map PizzaStore door de volgende opdracht in te voeren:

    cd PizzaStore
    
  3. Installeer het Swashbuckle-pakket:

    dotnet add package Swashbuckle.AspNetCore --version 6.5.0
    
  4. Open het project in Visual Studio Code.

  5. Maak met Visual Studio Code een Pizza.cs-bestand in de hoofdmap van het project en geef het 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 Pizza klasse 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.

  6. 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();
    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 Yes in het dialoogvenster.

EF Core toevoegen aan het project

Als u de items in de takenlijst wilt opslaan, installeert u het EntityFrameworkCore.InMemory pakket.

  1. 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.0
    
  2. Voeg 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. De PizzaDb klasse voert de volgende taken uit:

    • Pizzas Uw eigenschap beschikbaar maken in uw lijst Pizza met gegevens in de database.
    • Gebruik UseInMemoryDatabase deze functie om de opslag van de in-memory database te verbinden. Uw gegevens worden hier opgeslagen zolang de app wordt uitgevoerd.
  3. Als u uw in-memory database wilt instellen, voegt u de volgende code toe aan de onderkant van het Bestand Pizza.cs (boven de laatste }). U hebt twee klassedefinities in de PizzaStore.Models naamruimte.

    class PizzaDb : DbContext
    {
        public PizzaDb(DbContextOptions options) : base(options) { }
        public DbSet<Pizza> Pizzas { get; set; } = null!;
    }
    

    DbContext vertegenwoordigt een verbinding of sessie die wordt gebruikt om exemplaren van entiteiten in een database op te vragen en op te slaan.

  4. Voeg using PizzaStore.Models; toe aan het begin van het bestand Program.cs .

  5. 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 om een route '/pizza's' toe te app.Run(); voegen:

    app.MapGet("/pizzas", async (PizzaDb db) => await db.Pizzas.ToListAsync());
    

De toepassing uitvoeren

  1. Zorg ervoor dat u al uw wijzigingen hebt opgeslagen. Voer de app uit door in de terminal aan te roepen dotnet run . 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 selectie van willekeurige poorten wilt overschrijven, kunt u instellen dat de poorten worden gebruikt in launch Instellingen.json.

    dotnet run
    

    Hier 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>/PizzaStore
    
  2. Ga in uw browser naar https://localhost:{PORT}/swagger. Selecteer de GET /pizzas knop, gevolgd door Uitproberen en Uitvoeren. U ziet dat de lijst leeg is onder Response body.

  3. 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 aan 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 zou u moeten zien POST/pizza. Nieuwe items toevoegen aan de pizzalijst:

  1. Selecteer POST /pizza.

  2. Selecteer Uitproberen.

  3. Vervang de aanvraagbody door de volgende JSON:

    {
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
    }
    
  4. Selecteer Uitvoeren.

De items in de lijst lezen:

  1. Selecteer GET /pizza's.

  2. Selecteer Uitproberen.

  3. Selecteer Uitvoeren.

    De Response body items worden zojuist toegevoegd.

    [
      {
        "id": 1,
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
      }
    ]
    
  4. Druk op Ctrl+C in de terminal om te stoppen met het uitvoeren van de app. Voor de rest van deze oefening stopt en start u de app opnieuw zoals u wilt 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 wilt idophalen, 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

  1. Selecteer PUT /pizza/{id} in de Swagger UI.

  2. Selecteer Uitproberen.

  3. Voer in het tekstvak id 1 in.

  4. Request bodyWerk ten slotte bij. Plak de volgende JSON en ga naar namePineapple.

    {
       "id": 1,
       "name": "Pineapple"
    }
    
  5. 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 waaronder PUT /pizza/{id} 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();
});

DELETE 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 zich tussen afsluiten van toepassingen blijft voordoen.