In questo articolo vedremo come creare dei modelli di classe per la mappatura e gestione dei dati, per un database Sql Server, partendo da una base dati già realizzata.
A differenza di un articolo pubblicato diverso tempo fa, qui https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_introduzione-ad-entity-framework-core-con-dotnet-6_1804.aspx l’articolo, vedremo in questo nuovo articolo, come realizzare le classi per la gestione dei dati in un database Sql Server, ma soprattutto la relativa transazione.
Tramite la classe “BeginTransaction” vedremo come effettuare il salvataggio dei dati, qualora le operazioni siano andate a buon fine, oppure annullarle in caso di eccezioni.
I metodi Commit e Rollback rispettivamente salvano i dati o annullano le operazioni sui dati.
Il codice utilizzato in questo articolo riguarda applicazioni “Desktop” ma si può applicare anche per scenari web, con la tecnologia “Asp.Net”, come linguaggio di programmazione utilizzeremo C# mentre l’ambiente di sviluppo è Visual Studio 2022 Community, con l’ultima versione rilasciata che nel momento di pubblicazione dell’articolo è la 7.
Creazione del database
Prima di creare il progetto e scrivere codice, occorre creare un database con le relative tabelle, nel nostro caso, il database si chiamerà “Dati” e conterrà una tabella denominata “Anagrafica”. La tabella, conterrà tre colonne, la prima denominata “IdAnagrafica” e sarà di tipo chiave e contatore, la seconda colonna denominata “Nome” ed è di tipo VarChar di 100 non null, mentre la terza ed ultima si chiamerà “Cognome” ed è di tipo “VarChar” di 100 che non ammette valori null, il tutto come mostrato in figura 1.
Figura 1 – La tabella con le tre colonne
Creazione del progetto
Terminata la creazione delle tabelle e del database, non resta che creare il progetto per fare le prove di inserimento dati e la gestione delle transazioni.
Si apre Visual Studio 2022 Community e si seleziona come modello di progetto quello relativo a “App Windows Forms”, nella pagina successiva impostare un nome e fare click sul pulsante “Avanti”, nella finestra successiva selezionare la versione del Framework “7” che è l’ultima nel momento in cui si sta scrivendo l’articolo.
Terminata la creazione del progetto, aggiungiamo un pulsante che servirà a simulare un inserimento dati.
Aggiungiamo il riferimento al pacchetto di EntityFramework Core per Sql Server e EntityFramework tools.
Dalla finestra di Nuget, digitiamo “Microsoft.EntityFrameworkCore.SqlServer” versione 7, che è l’ultima ed installiamola nel nostro progetto, e poi sempre nella finestra “Nuget” digitiamo “Microsoft.EntityFrameworkCore.Tools” ed installiamo anche quest’ultima, il tutto come mostrato in figura 2.
Figura 2 – I due componenti da installare.
Stesura del codice
Prima di scrivere il codice per verificare la correttezza della gestione dei dati, ma soprattutto utilizzare le transazioni, occorre creare le classi di riferimento alle tabelle del database tramite il comando “Scaffold”.
Questo comando permette la creazione delle classi, prendendo come riferimento il nome database che viene indicato.
PM=>Scaffold-DbContext "Server=NomeDBSqlServer;Database=NomeDatabase;TrustServerCertificate=True;Trusted_Connection=True;"
Nel caso che generi il seguente errore “Error Number:-2146893019 A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - Catena di certificati emessa da una Autorità di certificazione non disponibile nell'elenco locale.)”
Occorre impostare nella stringa di connessione, il parametro “TrustServerCertficate=True”, il tutto come riportato qui di seguito.
PM=>Scaffold-DbContext "Server=NomeDBSqlServer;Database=NomeDatabase;TrustServerCertificate=True;Trusted_Connection=True;"
A questo punto verranno create le classi per ogni tabella, nel nostro esempio una sola, ed i file di gestione del database, il tutto come mostrato in figura 3.
Figura 3 – La creazione delle classi e file per la gestione della tabella e della connessione al database.
In visualizzazione grafica della form, facciamo doppio click sul pulsante, in modo da passare in visualizzazione codice della form nell’evento click del pulsante.
Tramite la classe contesto, si crea un oggetto di tipo “BeginTransaction” con il quale andremo a gestire nella parte della gestione delle eccezioni (try, Catch) il salvataggio ed annullamento dei dati.
Dopo aver aggiunto dei dati alla classe “Anagrafica” dell’istanza del contesto, tramite il metodo “Add” salvo i dati tramite il metodo SaveChanges, questo comando trovandosi in una transazione, non sarà effettivo fino al momento in cui verrà eseguito il metodo “Commit”.
Per annullare queste modifiche, nella gestione delle eccezioni utilizzo il metodo “Rollback”, tale eccezione viene sollevata dividendo un numero per zero.
Di seguito si riporta il frammento di codice delle suddette operazioni.
C#
private void BtnInserimento_Click(object sender, EventArgs e)
{
using var dbContext = new DatiContext();
using var transazione = dbContext.Database.BeginTransaction();
try
{
dbContext.Anagraficas.Add(new Anagrafica {Nome = "Emanuele", Cognome = "Mattei" });
dbContext.SaveChanges();
dbContext.Anagraficas.Add(new Anagrafica { Nome = "Luigi", Cognome = "Cristaldi" });
dbContext.SaveChanges();
int valore = 5;
//Genero eccezione
var risultato = valore / 0;
transazione.Commit();
}
catch (Exception ex)
{
transazione.Rollback();
MessageBox.Show(ex.Message);
}
}
Per rendere effettive i vari inserimenti, dobbiamo togliere la riga di codice dove avviene la divisione per zero, e noteremo che il dato sarà salvato nel momento in cui verrà eseguito il commando “Commit”.
Conclusioni
L’articolo ha voluto fornire al lettore una panoramica di Entity Framework Core 7, con l’ultima versione del Framework .Net, illustrando la tecnica della creazione delle classi per la gestione dei dati partendo da un database esistente.
L’articolo ha voluto focalizzarsi in particolare sulla transazione, riguardante quel contesto in cui effettuare più operazioni in una determinata esecuzione, come può essere inserimento, cancellazione e modifica dei dati, tutte operazioni su tabelle o tabella che richiedono che tutti i comandi devono essere eseguiti ed in caso di un’operazione non andata a buon fine annullare tutte le operazioni.
Questa tecnica ritorna utile anche con le tabelle in relazione o comunque nel gestire i dati a cascata e quindi devono essere gestiti tutti nella singola operazione.