Lezione 3 – Modifica e Migrazioni del Database
Abbiamo visto come funziona l’automatismo di migrazione del database da parte di Entity Framework. Ma possiamo gestire meglio questa funzionalità direttamente all’interno di VS2022.
Andiamo a modificare i campi dalla tabella AspNetUsers e verifichiamo che la migrazione sia eseguita correttamente.
Per prima cosa andiamo a definire un nuovo modello di classe nel folder Model. Click destro su Model->Add->Class.
Il nome della nuova classe sarà ApplicationUser.
Aggiungiamo la classe ai modelli dati. Il codice della nuova classe sarà quello base e non quello richiesto all’attività di vendita online.
public class ApplicationUser : IdentityUser
{
//extended info
[Required]
[Display(Name = "Nome"), StringLength(256, MinimumLength = 0)]
public string Name { get; set; }
[Display(Name = "Indirizzo"), StringLength(256, MinimumLength = 0)]
public string Address { get; set; }
[Display(Name = "Codice Postale"), StringLength(16, MinimumLength = 0)]
public string PostalCode { get; set; }
[Display(Name = "Città"), StringLength(256, MinimumLength = 0)]
public string City { get; set; }
[Display(Name = "Stato/Regione"), StringLength(2, MinimumLength = 0)]
public string State { get; set; }
[Required]
[Display(Name = "Nazione"), StringLength(256, MinimumLength = 0)]
public string Country { get; set; }
[Display(Name = "C.Fiscale o P.IVA"), StringLength(16, MinimumLength = 0)]
public string FiscalCode { get; set; }
[Display(Name = "Visualizza Email negli Annunci e Blog"), DefaultValue(true)]
public bool ConsensoViewEmail { get; set; }
[Display(Name = "Consenso al caricamento dei Cookie del Sito"), DefaultValue(false)]
public bool ConsensoCookie { get; set; }
[Display(Name = "Spedisci Email"), DefaultValue(false)]
public bool SendEmail { get; set; }
[Display(Name = "Ha dei Ruoli assegnati"), DefaultValue(false)]
public bool HasRoles { get; set; }
[DisplayName("Data di Registrazione")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = false)]
[Column(TypeName = "datetime2")]
public DateTime EntryDate { get; set; }
}
Andiamo quindi a modificarlo per aggiungere i campi necessari. Utilizziamo la libreria Identity Model per ereditare il contenuto della classe IdentityUser, alla quale aggiungeremo i nuovi campi.
Dopo l’inserimento del codice che definisce la classe ApplicationUser vediamo che ci sono una serie di annotazioni (Entity Framework Annotation) o namespace o tipi che hanno sotto una linea rossa e che se andassimo a compilare risulterebbero errori di sintassi. Questo perché VS2022 non ha idea dove trovare quella sintassi o almeno non in questo momento o modo.
Ci sono due modi a questo punto per risolvere il problema, il primo abbastanza lungo e complesso, il secondo veloce ed efficiente. Faccio un esempio: se prendiamo la sintassi IdentityUser, sappiamo che fa parte della libreria Identity Model (Microsoft.AspNetCore.Identity), se modifichiamo IdentityUser in Microsoft.AspNetCore.Identity.IdentityUser la sintassi risulterà corretta. Ma oltre ad essere una sintassi piuttosto lunga da scrivere e leggere risulta anche lungo tutto il lavoro di ricerca delle librerie e di scrittura supplementare. VS2022 ci fornisce una sintassi molto più veloce ed efficiente con la direttiva using ed un tool che la applica con rapidità e precisione. Se vi posizionate sulla sintassi in errore col mouse comparirà una piccola dropbox e una finestra di alert con “ CS0246 The type or namespace name 'type/namespace' could not be found (are you missing a using directive or an assembly reference?) ” se clickate sulla freccia in basso della dropbox si aprirà una lista di possibili using che risolverebbero l’errore di compilazione. Nel nostro caso la prima è appunto Microsoft.AspNetCore.Identity. Un click su using Microsoft.AspNetCore.Identity e verrà inserito in testa al file la using selezionata. E questo permetterà a tutte le sintassi nel file della stessa libreria di essere riconosciute. Se lo facciamo per tutte le sintassi in errore elimineremo tutti i possibili errori di compilazione.
Adesso rimangono solo delle sintassi con una sottolineatura verde (warning) che al momento della compilazione daranno appunto un warning di Non-nullable string. Potremo utilizzare la stessa funzionalità di autocorrezione del codice dichiarando nullable il campo string aggiungendo ? e avere così una stringa nullable (string?).
Oppure visto che non si tratta di un errore che pregiudica il funzionamento dell’applicazione, modificare il progetto per non dare questa informazione. Aprire con il Blocco Note il file FoodShop.csproj nella root del progetto e modifare <Nullable>enable</Nullable> in <Nullable>disable</Nullable>. Salvare e chiudere. Il warning non comparirà più.
Se Volessimo fare la modifica all’interno di VS2022 dobbiamo fare un click destro in alto nel Solution Explorer su FoodShop e scegliere Edit Project File, oppure un doppio click sempre su FoodShop.
Adesso andiamo ad utilizzare all’interno dell’applicazione il nostro ApplicationUser al posto del IdentityUser inserito dal modello MVC di VS2022.
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
Quello che andremo a fare è semplicemente dare al costruttore del IdentityDbContext il parametro adeguato a riconoscere il nostro utente per l’applicazione, che sarà appunto il tipo ApplicationUser.
Ora possiamo lanciare la migrazione con la nuova configurazione dell’utente con la modifica della tabella AspNetUsers. In basso a sinistra di VS2022 troviamo la Package Manager Console nella quale possiamo impartire diverse tipologie di direttiva. Tra queste ci sono quelle per la migrazione del database. I comandi da utilizzare sono add-migration e update-database.
La sintassi dei due comandi è questa:
Add-Migration [-Name] [-OutputDir] [-Context] [-Project] [-StartupProject] [-Namespace] [-Args] [CommonParameter]
Update-Database [-Migration] <String>] [-Connection <String>] [-Context <String>] [-Project <String>] [-StartupProject <String>] [-Args <String>] [<CommonParameters>]
Sarà sufficiente un nome o etichetta ad add-migration ed update-database senza parametri.
Possiamo vedere che nel file Data/Migration/20220105154100_appuser.cs generato per la migrazione dal Code First Migrations ci sono tutte le istruzioni per aggiungere i nuovi campi nella tabella AspNetUsers.
Se andiamo a verificare in SSMS le modifiche vediamo che adesso sono presenti i nuovi campi per l’utente dell’applicazione.
Nella prossima lezione andremo a popolare la tabella degli utenti con quelli di default, che serviranno per amministrare, gestire e utilizzare il sito web.