Übung: EF Core zu minimaler API hinzufügen
Sie sind Entwickler für ein Unternehmen, und Sie und Ihr Unternehmen haben über die neue minimale API gehört. Ihr Vorgesetzter hat Sie gebeten, ein Projekt dafür zu erstellen, damit Sie besprechen können, ob sie für Ihr nächstes Projekt verwendet werden soll.
Hinweis
In diesem Modul wird die .NET-CLI (Befehlszeilenschnittstelle) und Visual Studio Code für die lokale Entwicklung verwendet. Nach Abschluss dieses Moduls können Sie die Konzepte mit Visual Studio (Windows), Visual Studio für Mac (macOS) oder bei der Weiterentwicklung mit Visual Studio Code (Windows, Linux und macOS) anwenden.
In diesem Modul wird das .NET 8.0 SDK verwendet. Stellen Sie sicher, dass .NET 8.0 installiert ist, indem Sie in Ihrem bevorzugten Befehlsterminal den folgenden Befehl ausführen:
dotnet --list-sdks
Die daraufhin angezeigte Ausgabe sieht in etwa wie im folgenden Beispiel aus:
6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]
Stellen Sie sicher, dass eine Version aufgeführt wird, die mit 8 beginnt. Wenn keine aufgeführt ist oder der Befehl nicht gefunden wird, installieren Sie das neueste .NET 8.0 SDK.
Einrichten des Projekts
Zunächst müssen Sie ein Projekt erstellen. Sie haben .NET 6 installiert, und Sie können losgehen. In dieser Einheit fügen Sie einer Pizzaverwaltungs-API Datenpersistenz hinzu.
Erstellen Sie in einem Terminal eine Web-API, indem Sie Folgendes ausführen
dotnet new:dotnet new web -o PizzaStore -f net8.0Das Verzeichnis "PizzaStore " sollte angezeigt werden.
Wechseln Sie zum PizzaStore-Verzeichnis , indem Sie den folgenden Befehl eingeben:
cd PizzaStoreInstallieren Sie das Swashbuckle-Paket:
dotnet add package Swashbuckle.AspNetCore --version 6.5.0Öffnen Sie das Projekt in Visual Studio Code.
Erstellen Sie mithilfe von Visual Studio Code eine Pizza.cs Datei im Projektstamm, und geben Sie ihm den folgenden Inhalt:
namespace PizzaStore.Models { public class Pizza { public int Id { get; set; } public string? Name { get; set; } public string? Description { get; set; } } }Die vorangehende
PizzaKlasse ist ein einfaches Objekt, das eine Pizza darstellt. Dieser Code ist Ihr Datenmodell. Später verwenden Sie Entity Framework (EF) Core, um dieses Datenmodell einer Datenbanktabelle zuzuordnen.Öffnen Sie Program.cs , und fügen Sie den hervorgehobenen Code hinzu:
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();Möglicherweise erhalten Sie eine Aufforderung von Visual Studio Code, Objekte hinzuzufügen, um das Projekt zu debuggen. Wählen Sie
Yesim Dialogfeld aus.
Hinzufügen von EF Core zum Projekt
Um die Elemente in der liste to-do zu speichern, installieren Sie das EntityFrameworkCore.InMemory Paket.
Drücken Sie STRG+' , um ein Terminal in Visual Studio Code zu öffnen. Geben Sie im neuen Terminal den folgenden Code ein, um das EF Core InMemory-Paket hinzuzufügen:
dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 8.0Fügen Sie
using Microsoft.EntityFrameworkCore;am Anfang ihrer Program.cs - und Pizza.cs Dateien hinzu.Nachdem Sie ef Core dem Projekt hinzugefügt haben, können Sie den Code mit den Daten verknüpfen, die Sie speichern und abfragen möchten. Zu diesem Schritt erstellen Sie eine
PizzaDbKlasse. DiePizzaDbKlasse führt die folgenden Aufgaben aus:- Verfügbarmachen der
Pizzas-Eigenschaft aus der Liste vonPizzain der Datenbank - Verknüpfen des In-Memory-Datenbankspeichers mithilfe von
UseInMemoryDatabaseIhre Daten werden hier gespeichert, solange die App ausgeführt wird.
- Verfügbarmachen der
Um die In-Memory-Datenbank einzurichten, fügen Sie den folgenden Code am Ende der Pizza.cs Datei (vor dem letzten
}) hinzu. Sie verfügen über zwei Klassendefinitionen imPizzaStore.ModelsNamespace.class PizzaDb : DbContext { public PizzaDb(DbContextOptions options) : base(options) { } public DbSet<Pizza> Pizzas { get; set; } = null!; }DbContextstellt eine Verbindung oder Sitzung dar, die zum Abfragen und Speichern von Instanzen von Entitäten in einer Datenbank verwendet wird.Fügen Sie
using PizzaStore.Models;am Anfang der Program.cs Datei hinzu.Fügen Sie in Program.cs vor dem Aufruf
AddSwaggerGenden folgenden Code hinzu:builder.Services.AddDbContext<PizzaDb>(options => options.UseInMemoryDatabase("items"));
Zurückgeben einer Liste von Elementen
Um aus einer Liste von Elementen in der Pizzaliste zu lesen, fügen Sie den folgenden Code oberhalb des Aufrufs von
app.Run();hinzu, um die Route „/pizzas“ hinzuzufügen:app.MapGet("/pizzas", async (PizzaDb db) => await db.Pizzas.ToListAsync());
Ausführen der Anwendung
Vergewissern Sie sich, dass Sie alle Änderungen gespeichert haben. Führen Sie die App aus, indem Sie
dotnet runim Terminal ausführen. Mit dieser Aktion wird die App erstellt und auf einem Port von 5000-5300 gehostet. HTTPS hat einen Port für ihn im Bereich 7000-7300 ausgewählt.Hinweis
Wenn Sie das Zufällige Portauswahlverhalten außer Kraft setzen möchten, können Sie die Ports festlegen, die in launchSettings.jsonverwendet werden sollen.
dotnet runSo kann die Ausgabe im Terminal aussehen:
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>/PizzaStoreWechseln Sie in Ihrem Browser zu https://localhost:{PORT}/swagger. Wählen Sie die
GET /pizzasSchaltfläche aus, gefolgt von " Ausprobieren" und "Ausführen". Sie werden sehen, dass die Liste unterResponse bodyleer ist.Drücken Sie im Terminal STRG+C , um die Ausführung des Programms zu beenden.
Neue Elemente erstellen
Fügen wir den Code zum Einfügen (POST) neuer Elemente zur Pizzaliste hinzu. Fügen Sie in Program.cs den folgenden Code unter dem app.MapGet zuvor erstellten Code hinzu.
app.MapPost("/pizza", async (PizzaDb db, Pizza pizza) =>
{
await db.Pizzas.AddAsync(pizza);
await db.SaveChangesAsync();
return Results.Created($"/pizza/{pizza.Id}", pizza);
});
Testen der API
Stellen Sie sicher, dass Sie alle Ihre Änderungen gespeichert haben, und führen Sie die App erneut aus. Gehen Sie zurück zur Swagger-Oberfläche, und nun sollten Sie POST/pizza sehen. So fügen Sie der Pizzaliste neue Elemente hinzu:
Wählen Sie POST /Pizza aus.
Wählen Sie "Ausprobieren" aus.
Ersetzen Sie den Anforderungstext durch den folgenden JSON-Code:
{ "name": "Pepperoni", "description": "A classic pepperoni pizza" }Wählen Sie "Ausführen" aus.
So lesen Sie die Elemente in der Liste:
Wählen Sie GET /Pizzas aus.
Wählen Sie "Ausprobieren" aus.
Wählen Sie "Ausführen" aus.
Dies
Response bodyschließt die soeben hinzugefügten Elemente ein.[ { "id": 1, "name": "Pepperoni", "description": "A classic pepperoni pizza" } ]Drücken Sie STRG+C im Terminal, um die Ausführung der App zu beenden. Beenden Sie die App für den Rest dieser Übung, und starten Sie sie neu, um Ihre Änderungen zu testen. Achten Sie jedoch darauf, vor der Ausführung von
dotnet runalle Änderungen zu speichern!
Abrufen eines einzelnen Elements
Um ein Element mit GET nach id abzurufen, fügen Sie den Code unterhalb der app.MapPost-Route hinzu, die Sie zuvor erstellt haben.
app.MapGet("/pizza/{id}", async (PizzaDb db, int id) => await db.Pizzas.FindAsync(id));
Testen des GET anhand der ID
Um diesen Vorgang zu testen, können Sie entweder zur https://localhost:{PORT}/pizza/1 gehen oder die Swagger-Benutzeroberfläche verwenden. Da Sie eine In-Memory-Datenbank verwenden, wird die zuvor erstellte Pizza nicht aufgeführt, wenn Sie die Anwendung neu gestartet haben. Daher müssen Sie ihren POST-Vorgang verwenden, um ihn erneut hinzuzufügen.
Aktualisieren eines Elements
Um ein vorhandenes Element zu aktualisieren, fügen Sie den Code unter der GET /pizza/{id} von Ihnen erstellten Route hinzu:
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();
});
Testen von PUT
Wählen Sie PUT /pizza/{id} in der Benutzeroberfläche von Swagger aus.
Wählen Sie "Ausprobieren" aus.
Geben Sie im Textfeld id1 ein.
Aktualisieren Sie schließlich
Request body. Fügen Sie den folgenden JSON-Code ein, und ändern Sie ihnnameinPineapple.{ "id": 1, "name": "Pineapple" }Wählen Sie "Ausführen" aus.
Um den Code zu testen, scrollen Sie zurück zu GET /pizza/{id}. Die Pizza hat jetzt den Namen Pineapple.
Löschen eines Elements
Um ein vorhandenes Element zu löschen, fügen Sie den Code hinzu, unter PUT /pizza/{id} dem Sie zuvor erstellt haben:
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();
});
Testen von DELETE
Versuchen Sie nun, ein Element mithilfe der Swagger-Schnittstelle zu löschen.
In dieser Einheit haben Sie EF Core zu einer vorhandenen minimalen API-Anwendung hinzugefügt und eine In-Memory-Datenbank zum Speichern der Daten verwendet. Als Nächstes erfahren Sie, wie Sie eine echte Datenbank verwenden, um die Daten zwischen dem Herunterfahren der Anwendungen zu speichern, damit sie beibehalten werden.