C# Entity Framework core la gestione del log

La gestione dei logs tramite Entity Framework Core con la versione .Net 7 ed il linguaggio C#.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come gestire i log, o meglio tracciare le varie azioni che avvengono tramite le operazioni CRUD che si effettuano sui dati, il tutto utilizzando la versione di Entity Framework Core 7 con il Framework 7 ed il linguaggio di programmazione C#.
La gestione dei logs può divenire utile qualora si ha la necessità di conoscere le varie operazioni che hanno scatenato un evento, sia a livello informativo e sia a livello di errore.
In questo articolo vedremo come gestire i log, utilizzando l’ambiente di sviluppo Microsoft Visual Studio Community 2022.

Creazione database

Si crea un database in Microsoft Sql Server, in questo caso è stato utilizzato un database già esistente denominato “Dati” con tre tabelle denominate “Anagrafica” che sarà quella che utilizzeremo, “Categorie” e “Negozi”.
La tabella “Anagrafica” contiene 4 colonne, una di tipo numerico contatore nominata “IdAnagrafica” una colonna di tipo varchar da 50 nominata “Nome”, un’altra colonna nominata “Cognome” sempre di tipo “Varchar” con lunghezza 50, ed infine una colonna di tipo Varchar con dimensione 20 con il nome “Ruolo”, il tutto come mostrato in figura 1.

Figura 1 - La tabella Anagrafica

Figura 1 - La tabella Anagrafica 

Terminata la creazione del database non resta che creare il progetto.

Creazione del progetto e di entità

Apriamo Visual Studio 2022 Community, o versione successive, e tra i modelli preposti selezioniamo “app Windows Forms” che si trova filtrando per “Desktop” per il menu “tutti i tipi di progetti”, facciamo click tramite il pulsante “Avanti” e nella finestra successiva assegniamo un nome, facciamo di nuovo il click sul pulsante “Avanti” e selezioniamo l’ultima versione del Framework, in particolare la versione 7.
A questo punto verrà creato il progetto con una form, 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 riferimenti ad Entity Framwork

Figura 2 – I riferimenti ad Entity Framwork

Tramite riga di comando dalla console Nuget (Strumenti->Gestione Pacchetti Nuget-> Console di Gestione Pacchetti ) scriviamo il comando per la creazione delle classi di modello alle tabelle esistenti, il tutto tramite il comando “Scaffold-DbContext” che inserendo i vari parametri permette la creazione del modello.
Di seguito il comando da eseguire nella finestra dei comandi di Nuget, indicando il server del database ed il nome del database.

Scaffold-DbContext "Server=NomeServer;Database=Dati;TrustServerCertificate=True;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models


In questo modo verrà creata un cartella denominata Models con tutti le classi che rappresentano il database, ed una classe per la gestione dell’entità, il tutto come mostrato in figura 3.

Figura 3 – La cartella models

Figura 3 – La cartella models

Stesura del codice

Ora non resta che scrivere il codice per la gestione dei log, in particolare scrivere un primo codice che esegue una semplice query sulla tabella “Anagrafica” e poi vedere la gestione del log.
Facciamo doppio click sulla form, in un punto qualsiasi in modo che si passa in visualizzazione codice nell’evento load della form stessa.
La query estrapola tutti i record della tabella Anagrafica e visualizza a video il risultato della lettura dei dati, da notare che nella tabella sono presenti solo 3 record, quindi in caso di tabelle con tanti record, effettuate solo la selezione del primo record.
Di seguito si riporta il frammento di codice delle suddette operazioni

C#
private void Form1_Load(object sender, EventArgs e)
       {
           DatiContext datiEntita = new DatiContext();
           var risultato = datiEntita.Anagraficas.ToList();
           foreach ( var r in risultato ) {
                MessageBox.Show(r.Nome + " " + r.Cognome);
           }
       }

Possiamo eseguire il codice e vedremo che a video verrà visualizzato il valore presente nella proprietà “Nome”  e “Cognome” che corrispondono alle colonne nella tabella.
Verificata la correttezza del codice non resta che apportare le modifiche nell’evento “OnConfiguring” impostando nel “optionsBuilger” la gestione del log.
In particolare aggiungeremo il codice per visualizzare in debug le query che esegue, il tutto tramite il metodo “logTo”.
Si riporta il frammento di codice dell’evento “OnConfiguring”.

C#
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
       => optionsBuilder.UseSqlServer("Server=NomeServer;Database=Dati;TrustServerCertificate=True;Trusted_Connection=True;").LogTo(messaggio => Debug.WriteLine(messaggio));

Come si è visto dal codice precedente, il metodo LogTo (LogTo(messaggio => Debug.WriteLine(messaggio)); ) visualizza nel debug il messaggio dell’operazione.

Se ora proviamo ad eseguire il nostro programma, vedremo che nella finestra di debug, viene visualizzata l’istruzione SQL relativa alla query di estrapolazione dei dati, il tutto come mostrato in figura 4.

Figura 4 – La query che viene visualizzata nella finestra debug

Figura 4 – La query che viene visualizzata nella finestra debug

Se invece vogliamo scrivere in un file di testo, possiamo passare come parametro un oggetto di tipo “StreamWriter”.
Nella classe di contesto, ossia in “DatiContext” sotto la dichiarazione di classe, scriviamo il codice per la dichiarazione dell’oggetto di tipo “StreamWriter” di seguito il frammento di codice.

C#
private readonly StreamWriter scriviLog = new StreamWriter(Environment.CurrentDirectory+"\\LogApplicativo.txt", append: true);

Mentre nel metodo “LogTo” passiamo tale oggetto utilizzando il metodo “WriteLine”, il tutto come mostrato nel frammento qui di seguito.

C#
   protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
       => optionsBuilder.UseSqlServer("Server=NomeServer;Database=Dati;TrustServerCertificate=True;Trusted_Connection=True;").LogTo(scriviLog.WriteLine).EnableSensitiveDataLogging();

Da notare che è stato utilizzato il metodo “EnableSensitiveDataLogging” che permette di visualizzare informazioni sensibili come password ed altri dati importanti come i parametri passati.

Infine possiamo filtrare il log per livello di informazione, se quelli informativi, oppure errori, debug, e tanti altri ancora.
Nell’evento LogTo, passare il livello, che è un enumeratore dello spazio dei nomi di “using Microsoft.Extensions.Logging;”

Di seguito il frammento di codice per filtrare tramite information (se vogliamo visualizzare i dati mettiamo debug).

C#
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
       => optionsBuilder.UseSqlServer("Server=NomeServer;Database=Dati;TrustServerCertificate=True;Trusted_Connection=True;").LogTo(scriviLog.WriteLine, LogLevel.Information).EnableSensitiveDataLogging();

Conclusioni

L’articolo ha fornito al lettore le basi per effettuare la gestione dei log con Entity Framework Core, utilizzando come versione del Framework la 7.
Il log può tornare utile in quei casi che si vuole conoscere che tipo di query è stata eseguita ed altre informazioni utili sull’utilizzo dell’applicativo. Tenere traccia soprattutto degli errori, permette di affinare le correzioni del proprio progetto e renderlo sempre più performance.
In questo articolo è stato affrontato una delle tante tecniche della gestione dei log, da ricordare che ci sono componenti gratuiti ed a pagamento, che permettono di estendere nelle proprie applicazioni le funzionalità di gestione log ed informazioni sull’utilizzo dell’applicativo.