Oefening: Reverse-engineeren van een bestaande database
Contoso Pizza's manager heeft u gevraagd een eindpunt toe te voegen, zodat het bedrijf coupons in de app kan weergeven. De coupons bevinden zich in een bestaande database. In deze eenheid maakt u scaffolding op basis van een bestaande database en wijzigt u de resulterende entiteitsklasse.
De promotiedatabase controleren
Bekijk de database die u gaat gebruiken om de ge scaffolded code te genereren:
Vouw in het deelvenster Explorer de map Promoties uit, klik met de rechtermuisknop op het bestand Promotions.db en selecteer Database openen.
De nieuwe database wordt geopend in de map SQLite Explorer .
Vouw in de map SQLite Explorer de knooppunten Promotions.db en Coupons uit. Noteer het gegevensschema.
Klik met de rechtermuisknop op het knooppunt Coupons en selecteer Tabel weergeven. Inspecteer de coupongegevens.
Scaffold de context en het couponmodel van de promoties
Nu gebruikt u de database om de code te maken:
Voer de volgende opdracht uit:
dotnet ef dbcontext scaffold "Data Source=Promotions/Promotions.db" Microsoft.EntityFrameworkCore.Sqlite --context-dir Data --output-dir Models
De bovenstaande opdracht:
- Scaffolds
DbContext
en modelklassen met behulp van de opgegeven verbindingsreeks. - Hiermee geeft u het gebruik van de
Microsoft.EntityFrameworkCore.Sqlite
databaseprovider. - Hiermee geeft u mappen voor de resulterende
DbContext
en modelklassen.
Notitie
In deze oefening kunt u de waarschuwing over uw verbindingsreeks in broncode negeren. Bewaar in echte code altijd uw verbindingsreeks s op een veilige locatie.
- Scaffolds
Open Modellen\Coupon.cs en inspecteer het geveerde model.
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; } } }
Omdat SQLite een beperkte set typen heeft vergeleken met C#, heeft het hulpprogramma voor scaffolding deducties gemaakt over welke C#-typen moeten worden gebruikt. De databasekolom is bijvoorbeeld
Expiration
gedefinieerd als een tekenreeks omdat SQLite geen datumgegevenstype heeft. Het hulpprogramma voor scaffolding heeft afgeleid dat het C#-type moet zijnDateOnly?
gebaseerd op de gegevens in de database.Tip
Als de database wordt gewijzigd, kunt u nieuwe scaffolded bestanden genereren. De gegenereerde bestanden worden telkens overschreven, maar ze worden gemaakt als
partial
klassen, zodat u ze kunt uitbreiden met aangepaste eigenschappen en gedrag in uw eigen, afzonderlijke bestanden.
Een couponeindpunt toevoegen
Voordat u de scaffolded code kunt testen, moet u een eindpunt toevoegen aan de API. Vervolgens voegt u een nieuwe API-controller toe.
Zie Een web-API maken met ASP.NET Core-controllers om beter te begrijpen hoe API-controllers werken.
Voeg in de map Controllers een bestand toe met de naam CouponController.cs met de volgende code:
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(); } }
Met deze code wordt een
api/coupon
eindpunt aan de API toegevoegd.In de voorgaande code:
- Een
PromotionsContext
object wordt geïnjecteerd in de constructor. - De
Get
methode retourneert alle coupons.
- Een
Vervang in Program.cs de
// Add the PromotionsContext
opmerking door de volgende code:builder.Services.AddSqlite<PromotionsContext>("Data Source=Promotions/Promotions.db");
Deze code registreert zich
PromotionsContext
bij het afhankelijkheidsinjectiesysteem.Sla al uw wijzigingen op en voer de app uit met behulp van
dotnet run
.
Het eindpunt testen
Nu het eindpunt is toegevoegd, test u de couponbewerkingen:
Ga naar de Swagger-gebruikersinterface van de API, zoals u in een eerdere oefening hebt gedaan (of vernieuw de bestaande gebruikersinterface in uw browser).
Vouw onder de kop Coupon de GET-bewerking uit en selecteer de knop Uitproberen .
Selecteer Uitvoeren. In de hoofdtekst van het antwoord ziet u de coupons uit de database:
[ { "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" } ]
U ziet dat dit
expiration
een datum/tijd-waarde is.
Dat is het! U hebt een scaffolding gemaakt en gewijzigd op basis van een bestaande database.