Introduzione ad Entity Framework Core con .Net 6

Articolo introduttivo sul nuovo .Net 6 ed Entity Framework Core con database LiteDB.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come utilizzare l’ultima versione di .Net e precisamente la 6 in ambiente Windows Application con Entity Framework Core, il tutto tramite il linguaggio di programmazione C# e Visual Studio 2022 Community.
Entity Framework Core, a differenza della versione precedente, non permette la gestione grafica delle entità le quali permettono tramite classi di mappare le varie tabelle, a differenza delle versioni precedenti occorre scrivere il codice e non più tramite wizard che guida lo sviluppatore alla gestione dei dati.
Con il nuovo Entity Framework Core, è possibile gestire le varie basi dati, anche su altri sistemi che non sono Windows, come Ubuntu, Raspberry, Linux ed altri ancora.

Creazione del progetto

Si crea un nuovo progetto selezionando tra i vari progetti quelli di tipo “App Windows Forms”, fare click sul pulsante “Avanti” , inserire un nome a vostro piacimento e selezionare come versione del Framework la versione “.Net 6.0” .
Nella form aggiungiamo i seguenti controlli due controlli label, che saranno intestazione, due controlli di tipo casella di testo (textboxt) con la proprietà “Name” impostato una a “TxtNome” e l’altra a “TxtCognome”, tre pulsanti con la proprietà “Name” impostata una su “BtnInserisc” l’altro su “BtnModifica” e l’ultimo con il valore impostato con “BtnElimina”. Sempre per i pulsanti, impostiamo la proprietà “Text” con il valore “Inserisci", l’altro con “Modifica” ed infine l’ultimo con “Elimina”, la form dovrà avere l’aspetto simile a quello in figura 1.

La form con i vari controlli

Figura 1 – In controlli nella form

Terminata la creazione della form non resta che scrivere il codice per eseguire le varie operazioni.

Stesura del codice

Vedremo le operazioni di inserimento, lettura, modifica e cancellazione dati, che si usano per ogni database utilizzando il nuovo Entity Framework Core con database Litedb
La prima operazione da fare è quella di aggiungere il riferimento ad Entity Framework Core per lite db, tramite console di Nuget, digitiamo il seguente comando.

Install-Package Microsoft.EntityFrameworkCore.Sqlite

A questo punto verrà installato il pacchetto di Entity Framework Core per LiteDB.
In questo articolo faremo un basilare utilizzo, la gestione dei dati è molto semplice, le operazioni si faranno su una sola tabella con inserimento dei campi per le caselle di testo, di tipo nome e cognome.
Per tanto si deve creare un modello che rappresenti una tabella, che chiameremo Anagrafica, con tre colonne (proprietà) id che è il contatore e chiave, una proprietà di tipo string, che rappresenta il nome, ed una proprietà di tipo “string” che rappresenta il cognome.

Si crea una classe denominata “DatiContext” nella quale saranno presenti le classi che mapperanno le tabelle (in questo caso solo una, quella di Anagrafica) ed il collegamento ed altre operazioni per la gestione del database.
Qui di seguito si riporta la classe “DatiContext” che vedremo inseguito con la gestione del database e la classe “Anagrafica”

C#
public class DatiContext
{
}

Dopo aver creato la classe occorre aggiungere il riferimento allo spazio dei nomi “Entity Framework Core”, sopra ad ogni dichiarazione inserire lo spazio dei nomi, di seguito il frammento di codice di tale dichiarazione.

C#
using Microsoft.EntityFrameworkCore;

Ora la casse creata in precedenza, quella del contesto denominata "DatiContext" eredita da DbContext, come riportato qui di seguito.

public class DatiContext : DbContext
{

}

Aggiungiamo all’interno dello spazio dei nomi, la definizione della classe Anagrafica, che farà da mapping con la tabella nel database.
Si crea una classe con tre proprietà, come accennato in precedenza.
Di seguito il frammento di codice delle suddette operazioni.

C#
public class Anagrafica
{
public int Id { get; set; }
public string Nome { get; set; }
public string Cognome { get; set; }
}

Nella classe creata in precedenza per la gestione del collegamento del database, che abbiamo creato con il nome “DatiContext” e che eredita da “DbContext”, dobbiamo creare una proprietà pubblica con il quale fornisce il percorso in cui verrà salvato il database, il percorso del database viene impostato nel costruttore, mentre l’override dell’evento “OnConfiguring” ci permette di impostare il percorso del database con la proprietà pubblica.
Una proprietà che rappresenta la classe Anagrafica, che è a tutti gli effetti la gestione della tabella.

La proprietà pubblica del percorso è per far comprendere al lettore che la classe per la gestione del database, il context lo possiamo personalizzare a nostro piacimento.

Di seguito si riporta le suddette operazioni.

C#
public class DatiContext : DbContext
{
public DbSet<Anagrafica> Anagrafiche { get; set; }
public string PercorsoDB { get; }
public DatiContext()
{
var Cartella = Environment.CurrentDirectory;
PercorsoDB = System.IO.Path.Join(Cartella, "Dati.db");
}
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite($"Data Source={PercorsoDB}");
}

Per fornire chiarezza su quanto illustrato in questo momento, si riporta il codice completo di tutto il file.

C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace WinEfCoreArt
{
public class DatiContext : DbContext
{
public DbSet<Anagrafica> Anagrafiche { get; set; }
public string PercorsoDB { get; }
public DatiContext()
{
var Cartella = Environment.CurrentDirectory;
PercorsoDB = System.IO.Path.Join(Cartella, "Dati.db");
}
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite($"Data Source={PercorsoDB}");
}
public class Anagrafica
{
public int Id { get; set; }
public string Nome { get; set; }
public string Cognome { get; set; }
}
}

La gestione dei dati è terminata, non resta che creare la tabella ed il database, questo lo facciamo tramite riga di comanda nella console di “Nuget”.
Il primo comando da eseguire nella console è quello di installare alcuni strumenti, scriviamo il seguente comando e diamo invio.ù

Install-Package Microsoft.EntityFrameworkCore.Tools

Al termine dell’installazione dovremmo avere esito positivo.
Dobbiamo eseguire il comando che crea una classe che permette di gestire le informazioni per poter creare la tabella ed il database.
Il comando per la creazione della classe da eseguire in console “Nuget” è il seguente.

Add-Migration InitialCreate

Ora non resta che eseguire il comando per creare il database (o aggiornare nel caso esiste) con la creazione o modifica della tabella, in base alla classe che abbiamo creato in precedenza dal nome “Anagrafica” che rappresenta la tabella.

Update-Database

Nella finestra “Esplora soluzione” vedremo che è stata creata una cartella dal nome “Migrations” contenente i file il tutto come mostrato in figura 2.

Figura 2 - Le classi che generate per la creazione del database e tabella
Figura 2 – Le classi per la creazione delle tabelle e database

Ora non resta che scrivere il codice per le operazioni sul database, torniamo nella form, ed in visualizzazione codice, scriviamo una funzione per il caricamento dei dati.
La funzione verrà richiamata da ogni pulsante nell’evento load della form.
Il caricamento dei dati avviene leggendo tutti i record della tabella anagrafica, qui di seguito il frammento di codice della funzione del caricamento dei dati.

C#
private void CaricaDati()
{
var Contesto = new DatiContext();
var Anagrafica = Contesto.Anagrafiche
.OrderBy(p => p.Id).ToList();
DtgDati.DataSource = Anagrafica;
}

Questa funzione sarà eseguita nell’evento load della form, qui di seguito il frammento di codice delle suddette operazioni.

C#
private void Form1_Load(object sender, EventArgs e)
{
CaricaDati();
}

Passiamo in visualizzazione grafica e facciamo doppio click sul pulsante denominato inserisci, in questo modo passiamo in visualizzazione codice nell’evento click.
In questo evento dovremmo scrivere il codice per l’inserimento dei dati, che sono inseriti nelle caselle di testo.
L’inserimento avviene utilizzando il metodo "Add" della classe contesto ed aggiungendo il rifermento alla classe “Anagrafica” passando alle proprietà “Nome” e “Cognome” i valori presenti nelle caselle di testo.
Tramite il metodo “SaveChanges” vengono salvati i dati.
Di seguito il frammento di codice delle suddette operazioni per l’evento click del pulsante “Inserisci”.

C#
private void BtnInserisci_Click(object sender, EventArgs e)
{
var dbContext = new DatiContext();
dbContext.Add(new Anagrafica { Nome = TxtNome.Text, Cognome = TxtCognome.Text });
dbContext.SaveChanges();
CaricaDati();
}

Ora passiamo in visualizzazione grafica e facciamo doppio click sul pulsante denominato “Modifica” in questo modo passiamo in visualizzazione codice dell’evento click del pulsante.
Il codice in questo caso è molto semplice, verifica se è stata selezionata una riga nella griglia, si prende l’identificativo che è la prima colonna, effettua una select per ottenere il record, valorizza le due proprietà con i valori nelle caselle di testo e poi effettua tramite il metodo “Update” l’aggiornamento, che sarà convalidato con il metodo “SaveChanges” del contesto.
Di seguito si riporta il frammento di codice delle suddette operazioni.

C#
private void BtnModifica_Click(object sender, EventArgs e)
{
if (DtgDati.SelectedRows.Count < 1)
{
MessageBox.Show("Selezionare un record");
return;
}
var dbContext = new DatiContext();
var Anagrafica = dbContext.Anagrafiche.Where(p => p.Id == (int)DtgDati.SelectedCells[0].Value).FirstOrDefault();
Anagrafica.Nome = TxtNome.Text;
Anagrafica.Cognome = TxtCognome.Text;
dbContext.Update(Anagrafica);
dbContext.SaveChanges();
CaricaDati();
}

Ora passiamo in visualizzazione grafica, e facciamo click sul pulsante “Elimina”, in modo visualizzare la modalità codice dell’evento click del pulsante.
Anche in questo caso, tramite il metodo “Remove” dell’oggetto del contesto, eliminiamo l’entità individuato tramite una ricerca per il campo chiave ID. Ottenuto il singolo elemento, viene passato al metodo “Remove” e tramite il metodo “SaveChanges” si conferma la cancellazione del dato.
Di seguito si riporta il frammento di codice delle suddette operazioni.

C#
private void BtnElimina_Click(object sender, EventArgs e)
{
if (DtgDati.SelectedRows.Count < 1)
{
MessageBox.Show("Selezionare un record");
return;
}
var dbContext = new DatiContext();
var Anagrafica = dbContext.Anagrafiche.Where(p => p.Id == (int)DtgDati.SelectedCells[0].Value).FirstOrDefault();
dbContext.Remove(Anagrafica);
dbContext.SaveChanges();
CaricaDati();
}

Conclusioni

Ora non resta che eseguire la nostra applicazione e verificare il corretto funzionamento del codice, tenendo conto che il database si deve trovare nella stessa cartella in cui viene eseguito l’applicativo.
L’articolo ha voluto fornire una panoramica introduttiva al lettore per muoversi in maniera autonoma nella nuova versione di Entity Framework Core e del Framework .Net 6.

In questa nuova versione di Entity Framework, l'assenza della creazione delle entità in maniera grafica, rende lo sviluppo diverso ma permette allo sviluppatore di avere più controllo e visione del codice.

L'aspetto più importante sta nel fatto di utilizzarlo su più sistemi operativi e su diversi database, aspetto molto importante visto l'attuale scenario di multi piattaforma.