Esercizio - Inverso da un database esistente
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:
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.
Nel riquadro SQLITE EXPLORER espandere i nodi Promotions.db e Coupons. Prendere nota dello schema dei dati.
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:
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.
- Creare lo scaffolding di
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 essereDateOnly?
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.
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.
- Nel costruttore viene inserito un oggetto
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.Salvare tutte le modifiche ed eseguire l’app usando
dotnet run
:
Testare l'endpoint
Dopo aver aggiunto l'endpoint, testare le operazioni di coupon:
Passare all'interfaccia utente Swagger dell'API come è stato fatto in un esercizio precedente (o aggiornare l'interfaccia utente esistente nel browser).
Nell'intestazione Coupon espandere l'operazione GET e selezionare il pulsante Prova.
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!