Gyakorlat – EF Core hozzáadása a minimális API-hoz

Befejeződött

Ön egy vállalat fejlesztője, és Ön és a vállalata hallott az új minimális API-ról. A felettese arra kérte, hogy hozzon létre egy projektet, hogy meg tudja beszélni, hogy használja-e a következő projektben.

Jegyzet

Ez a modul a .NET CLI-t (parancssori felületet) és a Visual Studio Code-ot használja a helyi fejlesztéshez. A modul elvégzése után alkalmazhatja a fogalmakat a Visual Studio (Windows), a Mac Visual Studio (macOS) vagy a Visual Studio Code (Windows, Linux, & macOS) használatával történő folyamatos fejlesztéssel.

Ez a modul a .NET 8.0 SDK-t használja. Győződjön meg arról, hogy telepítve van a .NET 8.0, ha az alábbi parancsot futtatja az előnyben részesített parancsterminálban:

dotnet --list-sdks

A következő példához hasonló kimenet jelenik meg:

6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]

Győződjön meg arról, hogy egy 8 kezdődő verzió szerepel a listában. Ha egyik sem szerepel a listában, vagy a parancs nem található, telepítse a legújabb .NET 8.0 SDK-t.

A projekt beállítása

Először létre kell hoznia egy projektet. Telepítette a .NET 6-ot, és már indulhat is. Ebben a modulban adattartósságot fog hozzáadni egy pizzarendelési API-hoz.

  1. Egy terminálban hozzon létre egy webes API-t a dotnet newfuttatásával:

    dotnet new web -o PizzaStore -f net8.0
    

    Látni kellene a PizzaStore könyvtárat.

  2. Lépjen a PizzaStore könyvtárba a következő parancs megadásával:

    cd PizzaStore
    
  3. Telepítse a Swashbuckle csomagot:

    dotnet add package Swashbuckle.AspNetCore --version 6.5.0
    
  4. Nyissa meg a projektet a Visual Studio Code-ban.

  5. A Visual Studio Code használatával hozzon létre egy Pizza.cs fájlt a projekt gyökérkönyvtárában, és adja meg a következő tartalmat:

    namespace PizzaStore.Models 
    {
        public class Pizza
        {
              public int Id { get; set; }
              public string? Name { get; set; }
              public string? Description { get; set; }
        }
    }
    

    Az előző Pizza osztály egy egyszerű objektum, amely egy pizzát jelöl. Ez a kód az ön adatmodellje. Később az Entity Framework (EF) Core használatával leképezheti ezt az adatmodellt egy adatbázistáblára.

  6. Nyissa meg Program.cs , és adja hozzá a kiemelt kódot:

    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();
    

    Előfordulhat, hogy a Visual Studio Code kéri, hogy adjon hozzá eszközöket a projekt hibakereséséhez. Válassza Yes a párbeszédpanelen.

EF Core hozzáadása a projekthez

Ha az elemeket a to-do listában szeretné tárolni, telepítse a EntityFrameworkCore.InMemory csomagot.

  1. A Visual Studio Code-ban a Ctrl+' billentyűkombináció lenyomásával nyithat meg egy terminált. Az új terminálban adja meg a következő kódot az EF Core InMemory csomag hozzáadásához:

    dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 8.0
    
  2. Adja hozzá using Microsoft.EntityFrameworkCore; a Program.cs és Pizza.cs fájlok elejéhez.

    Most, hogy hozzáadta az EF Core-t a projekthez, lekötheti a kódot a menteni kívánt adatokhoz, és lekérdezheti őket. Ehhez létre kell hoznia egy PizzaDb osztályt. A PizzaDb osztály a következő feladatokat hajtja végre:

    • Tegye elérhetővé Pizzas tulajdonságát az adatbázis Pizza listájából.
    • Használja a UseInMemoryDatabase-t a memóriában lévő adatbázis-tároló bekötésére. Az adatok itt lesznek tárolva, amíg az alkalmazás fut.
  3. A memóriában lévő adatbázis beállításához adja hozzá a következő kódot a Pizza.cs fájl aljára (a végső }fájl felett). Két osztálydefiníciót fog használni a PizzaStore.Models névtérben.

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

    DbContext egy olyan kapcsolatot vagy munkamenetet jelöl, amely egy adatbázis entitáspéldányainak lekérdezésére és mentésére szolgál.

  4. Vegyen fel using PizzaStore.Models; a Program.cs fájl tetejére.

  5. A hívása előtt a AddSwaggerGen-ben adja hozzá a következő kódot:

    builder.Services.AddDbContext<PizzaDb>(options => options.UseInMemoryDatabase("items"));
    

Elemek listájának visszaadása

  • Ha a pizzalistában szereplő elemek listájából szeretne olvasni, adja hozzá a következő kódot a app.Run(); hívása fölött egy "/pizza" útvonal hozzáadásához:

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

Az alkalmazás futtatása

  1. Győződjön meg arról, hogy az összes módosítást mentette. Futtassa az alkalmazást úgy, hogy meghívja dotnet run a terminálban. Ez a művelet létrehozza az alkalmazást, és egy 5000 és 5300 közötti porton üzemelteti. A HTTPS-hez egy port lesz kiválasztva a 7000-7300 tartományban.

    Jegyzet

    Ha felül szeretné bírálni a véletlenszerű portkijelölési viselkedést, megadhatja a használandó portokat a launchSettings.json-ban.

    dotnet run
    

    Így nézhet ki a kimenet a terminálban:

    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. A böngészőjében lépjen a https://localhost:{PORT}/swaggeroldalra. Válassza a GET /pizzas gombot, majd próbálja ki, és hajtsa végre. Láthatja, hogy a lista üres a Response bodyalatt.

  3. A terminálban nyomja le a Ctrl+C billentyűkombinációt a program futtatásának leállításához.

Új elemek létrehozása

Vegyük fel a kódot a pizzák listájára, hogy új elemeket adjunk hozzá POST-hoz. A Program.cs - ben adja hozzá a következő kódot az alább található, korábban létrehozott app.MapGet alatt.

app.MapPost("/pizza", async (PizzaDb db, Pizza pizza) =>
{
    await db.Pizzas.AddAsync(pizza);
    await db.SaveChangesAsync();
    return Results.Created($"/pizza/{pizza.Id}", pizza);
});

Az API tesztelése

Győződjön meg arról, hogy mentette az összes módosítást, és futtassa újra az alkalmazást. Lépjen vissza a Swagger felhasználói felületére, és most látnia kell POST/pizza. Új elemek hozzáadása a pizzalistához:

  1. Válaszd a POST /pizzalehetőséget.

  2. Válassza a Kipróbálás lehetőséget.

  3. Cserélje le a kérelem törzsét a következő JSON-ra:

    {
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
    }
    
  4. Válassza a Végrehajtás lehetőséget.

A lista elemeinek olvasása:

  1. Válassza a GET /pizzaslehetőséget.

  2. Válassza a Kipróbálás lehetőséget.

  3. Válassza a Végrehajtás lehetőséget.

    A Response body az imént hozzáadott elemeket is tartalmazni fogja.

    [
      {
        "id": 1,
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
      }
    ]
    
  4. Az alkalmazás futtatásának leállításához nyomja le a Ctrl+C billentyűkombinációt a terminálban. A gyakorlat hátralévő részében állítsa le és indítsa újra az alkalmazást a módosítások teszteléséhez. Győződjön meg róla, hogy az összes módosítást mentette, mielőtt dotnet run!

Egyetlen elem lekérése

A id útvonalon keresztül történő elem lekéréséhez adja hozzá a kódot a korábban létrehozott app.MapPost útvonalon.

app.MapGet("/pizza/{id}", async (PizzaDb db, int id) => await db.Pizzas.FindAsync(id));

Azonosító szerinti GET kérés tesztelése

A művelet teszteléséhez nyissa meg a https://localhost:{PORT}/pizza/1, vagy használja a Swagger felhasználói felületét. Mivel memóriabeli adatbázist használ, a korábban létrehozott pizza nem fog szerepelni, ha újraindította az alkalmazást. Ezért a POST művelettel újra hozzá kell adnia.

Elem frissítése

Meglévő elem frissítéséhez adja hozzá a kódot a létrehozott GET /pizza/{id} útvonalon:

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();
});

PUT tesztelése

  1. Válassza a PUT /pizza/{id} lehetőséget a Swagger felhasználói felületén.

  2. Válassza a Kipróbálás lehetőséget.

  3. A azonosító szövegmezőbe írja be 1.

  4. Végül frissítse a(z) Request body-at. Illessze be a következő JSON-t, és módosítsa name-t Pineapple-re.

    {
       "id": 1,
       "name": "Pineapple"
    }
    
  5. Válassza a Végrehajtás lehetőséget.

A kód teszteléséhez görgessen vissza a GET /pizza/{id}. A pizzának mostantól a neve Pineapple.

Elem törlése

Meglévő elem törléséhez adja hozzá a korábban létrehozott PUT /pizza/{id} kódot:

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();
});

A DELETE tesztelése

Most próbálja meg törölni az elemet a Swagger felület használatával.

Ebben a leckében hozzáadta az EF Core-t egy meglévő minimális API-alkalmazáshoz, és egy memórián belüli adatbázist használt az adatok tárolásához. Ezután megtudhatja, hogyan tárolhat valós adatbázist az adatok tárolására, hogy azok megmaradjanak az alkalmazásleállítások között.