Esercizio - Inverso da un database esistente

Completato

Il responsabile 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 scaffolded:

  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. Eseguire il comando seguente:

    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. La proprietà Expiration è definita come stringa, dal momento che SQLite non include un tipo datetime. Cambiare il tipo Expiration da string? a DateTime. EF Core gestirà la conversione di datetime in dati di tipo stringa.

    using System;
    using System.Collections.Generic;
    
    namespace ContosoPizza.Models
    {
        public partial class Coupon
        {
            public long Id { get; set; }
            public string Description { get; set; } = null!;
            public DateTime Expiration { get; set; }
        }
    }
    

    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. Quindi, si aggiunge 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 Prova.

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

L'operazione è terminata. È stato creato e modificato lo scaffolding da un database esistente.