Övning – Omvänd tekniker från en befintlig databas
Contoso Pizzas chef bad dig att lägga till en slutpunkt så att företaget kan visa kuponger i sin app. Kuponger finns i en befintlig databas. I den här lektionen skapar du byggnadsställningar från en befintlig databas och ändrar den resulterande entitetsklassen.
Granska kampanjdatabasen
Ta en titt på databasen som du ska använda för att generera den kod som har skapats:
I fönstret Utforskaren expanderar du katalogen Kampanjer, högerklickar på filen Promotions.db och väljer sedan Öppna databas.
Den nya databasen öppnas i mappen SQLite Explorer .
I mappen SQLite Explorer expanderar du noderna Promotions.db och Kuponger. Observera dataschemat.
Högerklicka på noden Kuponger och välj Visa tabell. Granska kupongdata.
Autogenerera kampanjkontexten och kupongmodellen
Nu använder du databasen för att skapa kod:
Kör följande kommando:
dotnet ef dbcontext scaffold "Data Source=Promotions/Promotions.db" Microsoft.EntityFrameworkCore.Sqlite --context-dir Data --output-dir Models
Kommandot ovan:
- Byggnadsställningar och modellklasser
DbContext
med hjälp av de angivna anslutningssträng. - Anger att databasprovidern ska
Microsoft.EntityFrameworkCore.Sqlite
användas. - Anger kataloger för de resulterande
DbContext
klasserna och modellklasserna.
Kommentar
I den här övningen kan du ignorera varningen om att din anslutningssträng finns i källkoden. Lagra alltid dina anslutningssträng på en säker plats i verklig kod.
- Byggnadsställningar och modellklasser
Öppna Models\Coupon.cs och inspektera den scaffolded modellen.
using System; using System.Collections.Generic; namespace ContosoPizza.Models { public partial class Coupon { public int Id { get; set; } public string Description { get; set; } = null!; public DateOnly? Expiration { get; set; } } }
Eftersom SQLite har en begränsad uppsättning typer jämfört med C# har verktyget för byggnadsställningar dragit slutsatser om vilka C#-typer som ska användas. Databaskolumnen
Expiration
definierades till exempel som en sträng eftersom SQLite inte har någon datumdatatyp. Verktyget scaffolding drog slutsatsen att C#-typen skaDateOnly?
baseras på data i databasen.Dricks
Om databasen ändras kan du generera nya scaffolded-filer. De genererade filerna skrivs över varje gång, men de skapas som
partial
klasser, så du kan utöka dem med anpassade egenskaper och beteenden i dina egna, separata filer.
Lägga till en kupongslutpunkt
Innan du kan testa den kod som skapats med hjälp av en kod måste du lägga till en slutpunkt i API:et. Nu lägger du alltså till en ny API-kontrollant.
Mer information om hur API-kontrollanter fungerar finns i Skapa ett webb-API med ASP.NET Core-styrenheter.
I mappen Controllers lägger du till en fil med namnet CouponController.cs som innehåller följande kod:
using ContosoPizza.Data; using ContosoPizza.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace ContosoPizza.Controllers; [ApiController] [Route("[controller]")] public class CouponController : ControllerBase { PromotionsContext _context; public CouponController(PromotionsContext context) { _context = context; } [HttpGet] public IEnumerable<Coupon> Get() { return _context.Coupons .AsNoTracking() .ToList(); } }
Den här koden lägger till en
api/coupon
slutpunkt i API:et.I koden ovan:
- Ett
PromotionsContext
objekt matas in i konstruktorn. - Metoden
Get
returnerar alla kuponger.
- Ett
I Program.cs ersätter du kommentaren
// Add the PromotionsContext
med följande kod:builder.Services.AddSqlite<PromotionsContext>("Data Source=Promotions/Promotions.db");
Den här koden registreras
PromotionsContext
med beroendeinmatningssystemet.Spara alla ändringar och kör appen med hjälp
dotnet run
av .
Testa slutpunkten
Nu när slutpunkten har lagts till testar du kupongåtgärderna:
Gå till API:ets Swagger-användargränssnitt som du gjorde i en tidigare övning (eller uppdatera det befintliga användargränssnittet i webbläsaren).
Under rubriken Kupong expanderar du GET-åtgärden och väljer knappen Prova .
Välj Kör. Svarstexten visar kuponger från databasen:
[ { "id": 1, "description": "Buy 1 get 1 free", "expiration": "2025-01-01T00:00:00" }, { "id": 2, "description": "4 large pizzas for $40", "expiration": "2024-06-30T00:00:00" } ]
Observera att det
expiration
är ett datetime-värde.
Det var allt! Du har skapat och ändrat byggnadsställningar från en befintlig databas!