Esercizio - Inverso da un database esistente

Completato

Il manager di Contoso Pizza ha chiesto di aggiungere un endpoint in modo che l'azienda possa visualizzare i coupon nella sua app. I coupon risiedono in un database esistente. In questa unità si creerà lo scaffolding da un database esistente e si modificherà la classe di entità risultante.

Esaminare il database delle promozioni

Esaminare il database che si userà per generare il codice soggetto a scaffolding:

  1. Nel riquadro Esplora risorse espandere la directory Promozioni, fare clic con il pulsante destro del mouse sul file Promotions.db e quindi scegliere Apri database.

    Il nuovo database viene aperto nella cartella SQLite Explorer.

  2. Nel riquadro SQLITE EXPLORER espandere i nodi Promotions.db e Coupons. Prendere nota dello schema dei dati.

  3. Fare clic con il pulsante destro del mouse sul nodo Coupons e selezionare Mostra tabella. Esaminare i dati dei coupon.

Creare lo scaffolding del contesto delle promozioni e il modello di coupon

È ora possibile usare il database per eseguire lo scaffolding del codice:

  1. Esegui questo comando:

    dotnet ef dbcontext scaffold "Data Source=Promotions/Promotions.db" Microsoft.EntityFrameworkCore.Sqlite --context-dir Data --output-dir Models   
    

    Il comando precedente:

    • Creare lo scaffolding di DbContext e delle classi modello usando la stringa di connessione specificata.
    • Specifica di usare proovider di database Microsoft.EntityFrameworkCore.Sqlite.
    • Specifica le directory per l'elemento DbContext e le classi modello risultanti.

    Nota

    In questo esercizio è possibile ignorare l'avviso relativo alla stringa di connessione nel codice sorgente. Nel codice reale archiviare sempre le stringhe di connessione in una posizione sicura.

  2. Aprire Models\Coupon.cs ed esaminare il modello con scaffolding.

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

    Poiché SQLite ha un set limitato di tipi rispetto a C#, lo strumento di scaffolding ha fatto inferenze in base ai tipi C# da usare. Ad esempio, la colonna del database Expiration è stata definita come stringa, perché SQLite non ha un tipo di dati data. Lo strumento di scaffolding ha dedotto che il tipo C# deve essere DateOnly? in base ai dati nel database.

    Suggerimento

    Se il database cambia, è possibile generare nuovi file scaffolded. I file generati vengono sovrascritti ogni volta, ma vengono creati come classi partial che è possibile estendere con proprietà e comportamenti personalizzati in appositi file.

Aggiungere l'endpoint per i coupon

Prima di poter testare il codice scaffolded, è necessario aggiungere un endpoint all'API. Successivamente, aggiungere un nuovo controller API.

Per comprendere meglio il funzionamento dei controller API, vedere Creare un'API Web con controller di ASP.NET Core.

  1. Nella cartella Controllers aggiungere un file denominato CouponController.cs contenente il codice seguente:

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

    Questo codice aggiunge un endpoint api/coupon all'API.

    Nel codice precedente:

    • Nel costruttore viene inserito un oggetto PromotionsContext.
    • Il metodo Get restituisce tutti i coupon.
  2. In Program.cs sostituire il commento // Add the PromotionsContext con il codice seguente:

    builder.Services.AddSqlite<PromotionsContext>("Data Source=Promotions/Promotions.db");
    

    Quello precedente consente di registrare PromotionsContext con il sistema di inserimento delle dipendenze.

  3. Salvare tutte le modifiche ed eseguire l’app usando dotnet run:

Testare l'endpoint

Dopo aver aggiunto l'endpoint, testare le operazioni di coupon:

  1. Passare all'interfaccia utente Swagger dell'API come è stato fatto in un esercizio precedente (o aggiornare l'interfaccia utente esistente nel browser).

  2. Nell'intestazione Coupon espandere l'operazione GET e selezionare il pulsante Prova.

  3. Seleziona Execute. Il corpo della risposta mostra i coupon dal 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"
    }
    ]
    

    Si noti che expiration è un valore datetime.

Ecco fatto! Si ha creato e modificato lo scaffolding da un database esistente!