Oefening: Reverse-engineeren van een bestaande database

Voltooid

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:

  1. 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 .

  2. Vouw in de map SQLite Explorer de knooppunten Promotions.db en Coupons uit. Noteer het gegevensschema.

  3. 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:

  1. 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.

  2. 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 zijn DateOnly? 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.

  1. 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.
  2. 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.

  3. 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:

  1. Ga naar de Swagger-gebruikersinterface van de API, zoals u in een eerdere oefening hebt gedaan (of vernieuw de bestaande gebruikersinterface in uw browser).

  2. Vouw onder de kop Coupon de GET-bewerking uit en selecteer de knop Uitproberen .

  3. 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.