Esercizio - Inverso da un database esistente
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:
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:
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.
- Creare lo scaffolding di
Aprire Models\Coupon.cs. La proprietà
Expiration
è definita come stringa, dal momento che SQLite non include un tipo datetime. Cambiare il tipoExpiration
dastring?
aDateTime
. 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.
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 Prova.
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.