Visualizzazione post con etichetta Entity Framework. Mostra tutti i post
Visualizzazione post con etichetta Entity Framework. Mostra tutti i post

giovedì 17 luglio 2025

C# Linq To Entity Framework left join

In questo frammento di codice di Linq To Entity Framework, con il linguaggio di programmazione C#, illustra una tecnica per effettuare una select per estrapolare i dati da due tabelle.
Supponiamo di avere due tabelle e rilevare i dati da entrambi le tabelle, anche nel caso che il campo di relazione non è presente in una tabella, ma si vuole rilevare ugualmente il dato della prima tabella .
Tramite il metodo DefaultIfEmpty prende il dato anche se nella seconda tabella non sono presenti dati.

Di seguito il frammento di codice che estrapola i dati della tabella Portieri, in relazione alla tabella Condomini, anche se in quest'ultima non sono presenti dati di relazione.

C#

  var elencoPortieri = (from portiere in entita.Portieri

                                      join condominio in entita.Condomini

                                          on portiere.IdCondominio equals condominio.Id into gruppoCondomini

                                      from condominio in gruppoCondomini.DefaultIfEmpty()

                                      select new

                                      {

                                          idPortiere = portiere.IdPortieri,

                                          portiere.Nome,

                                          portiere.Cognome,

                                          portiere.DataNascita,

                                          portiere.Email,

                                          portiere.Indirizzo,

                                          portiere.Telefono,

                                          portiere.LuogoNascita,

                                          NomeFile = portiere.File!= null ? "Scarica" : "",

                                          portiere.Note,

                                          portiere.DataAssunzione,

                                          portiere.DataDimissioni,

                                          portiere.Stipendio,

                                          Condominio = condominio != null ? condominio.Nome : "Nessuno",

                                      }).OrderBy(p => p.idPortiere).ToList();

 

 

 

                DtgListaPortieri.AutoGenerateColumns = false;

                DtgListaPortieri.DataSource = elencoPortieri;






giovedì 17 aprile 2025

Entity Framework estensione di Visual Studio per visualizzare le prestazioni delle varie operazioni.

 


Per coloro che utilizzano Entity Framework, può tornare utile quella di avere un estensione per Visual Studio che fornisce informazioni grafiche sulle prestazioni delle varie operazioni.

Il componente  permette di conoscere le prestazioni delle varie query che vengono eseguite nella gestione dei dati.

Per maggiori informazioni e download visitate il seguente sito https://marketplace.visualstudio.com/items?itemName=GiorgiDalakishvili.EFCoreVisualizer dal Marketplace di Microsoft.

lunedì 14 aprile 2025

Entity Framework strumenti e componenti

Dal sito Microsoft, un elenco di componenti e strumenti per Visual Studio, per la gestione dei dati con Entity Framework.
Dal seguente sito Tools & Extensions - EF Core | Microsoft Learn sono elencati alcuni estensioni di Visual Studio o strumenti per migliorare l'attività lavorativa con Entity Framework.
Il sito è in lingua inglese.

domenica 6 aprile 2025

C# Entity Framework Core salvare un entità in un file xml con i relativi dati

Nel caso che abbiamo la necessità di trasformare un entità (tabella) di Entity Framework, in un file XML con i relativi dati, tramite linguaggio C#.
Con la classe XMLSerialize possiamo salvare i dati in un file XML.

Tramite la tecnica della serializzazione, trasformiamo l'entity in un un file XML con i relativi dati.

Supponiamo di avere un entità denominata dipartimento, con i campi Iddipartimento, descrizione e note,  che fa riferimento alla tabella, e vogliamo trasformarla in un file xml.

Di seguito si riporta la funzione, che passato una lista di entity, trasforma in un file XML tale entity.


C#

private void EntityToXML(List<Dipartimento> entityDipartimento)

 {

     //Oggetto per il tipo di serializzazione

           

     XmlSerializer serializerListaEntity = new XmlSerializer(typeof(List<Dipartimento>));

     //Oggetto per la scrittura del file

     using (var writerString = new StreamWriter(@"c:\varie\datiAnagrafica.xml"))

     {

         //Serializzo l'oggetto nel file xml

         serializerListaEntity.Serialize(writerString, entityDipartimento);

              

 

 

     }

 }   



Di seguito il relativo utilizzo di chiamata alla funzione.


C#

DatiContext dati = new DatiContext();

var datiDipartimento = dati.Dipartimentos.ToList();

EntityToXML(datiDipartimento);


sabato 7 ottobre 2023

C# Entity Framework core la gestione del log



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 

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

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

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

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.

domenica 2 luglio 2023

C# Creazione modello da un database esistente e le transazioni EF 7

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_csharp-creazione-modello-da-un-database-esistente-_1832.aspx 



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.

martedì 26 luglio 2022

Entity Framework Core creazione ed aggiornamento database

Di seguito si riportano i comandi da utilizzare nella console "Nuget" (Strumenti=>Gestione pacchetti Nuget=> Console di gestione pacchetti") per la creazione ed aggiornamento di un database, utilizzando Entity Framework, dopo aver creato o modificato i modelli (classi che mappano le tabelle) .

//Questo comando crea il collegamento per gestire il database mappando le classi come tabelle
Add-Migration InitialCreate
//Questo comando crea o aggiorna le tabelle nel database 
Update-Database

lunedì 25 luglio 2022

entity framework core primary key di un campo (proprietà)

Quando si creano classi per Entity Framework Core che devono mappare le tabelle, è opportuno impostare una proprietà della classe come chiave, in questo modo quando si va a creare la tabella, avrà una tabella di tipo chiave.
Con il nuovo EF, non abbiamo più la parte designer, ma tutto da codice, e quindi tramite appositi comandi la creazione anche delle tabelle.
Per impostare una proprietà di tipo Chiave, occorre inserire l'attributo key nella proprietà di proprio interesse.
Qui di seguito un esempio di codice in C#


using System.ComponentModel.DataAnnotations;

 public class Anagrafica
    {
        [Key]
        public Int32 IdAnagrafica { get; set; }
        public string Nome { get; set; }    
        public string Cognome { get; set; }
 
    }

domenica 24 aprile 2022

C# Connection Strings Entity Framework OnConfiguring

Nel caso che si utilizza Entity Framework, in modalità di creazione da codice e non tramite il Wizard, possiamo impostare la connessione al database, o scolpita nel codice oppure nel file di configurazione.
Nell'evento OnConfigurazione, possiamo rilevare la connection strings presente nel file di configurazione che abbiamo aggiunto al progetto, tramite la seguente istruzione di codice.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{

    string connessione = ConfigurationManager.ConnectionStrings["NomeParametro"].ConnectionString;
}

Per utilizzare la classe per la gestione dei parametri nel file di configurazione, occorre aggiungere il seguente spazio dei nomi

using System.Configuration;

martedì 19 aprile 2022

The entity type 'name table' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'. For more information on keyless entity types

Durante lo sviluppo di applicazioni gestionali, con il quale si usa Entity Framework, può accadere che venga generato il seguente errore: 

"
The entity type ' Name Table' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'. For more information on keyless entity types
"

Dove il "Name Table" è il nome dell'oggetto, o meglio della classe che rappresenta la tabella al quale vogliamo gestire i dati.
Questo errore è dovuto perchè nella classe non è presente un campo chiave, per risolvere tale problema, occorre mettere nella dichiarazione della classe, l'attributo "[Keyless]"  presente nello spazio dei nomi using System.ComponentModel.DataAnnotations; .


La classe sarà dichiarata in questo modo:

[Keyless]
    public class NomeClasse
{
    //codice

}

In alternativa dichiarare una proprietà di chiave primaria.

lunedì 12 luglio 2021

C# Utilizzo di Stored Procedure con Entity Framework Core in Asp.Net Core

 Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_utilizzo-di-stored-procedure-con-entity-framework-core-in-aspnet-core_1747.aspx


In questo articolo vedremo come utilizzare le stored procedure realizzate in Microsoft Sql Server, in Asp.Net MVC core tramite il linguaggio di programmazione C# e versione del Framework 5.0.

Come ambiente di sviluppo utilizzeremo  Visual Studio 2019 Community, un ambiente gratuito per lo sviluppo di vari progetti.

L’articolo vuole fornire le basi per la creazione di applicazioni web con l’ultima versione del Framework utilizzando Entity Framework Core.

Vedremo come accedere alla fonte dati, partendo dalla creazione di una classe.

La schermata per visualizzare i dati sarà simile alla figura 1.



Figura 1 – Pagina per la visualizzazione dei dati.


Creazione della Stored Procedure

Utilizzeremo la tabella Anagrafica, già utilizzata in vari articolo, che è composta da 4 colonne, IdAnagrafica, che è un campo chiave, nome, cognome e Ruolo che sono campi di tipo Varchar 50.

La stored Procedure che si crea, permette di selezionare i record che corrispondo al parametro passato.

Qui di seguito la SP per la ricerca dei dati nella tabella Anagrafica

CREATE PROCEDURE [dbo].[Trova]

        

       @Nome VARCHAR(50)

AS

BEGIN

 

       SET NOCOUNT ON;

    IF(@Nome IS NULL OR @Nome = '')

             SELECT * from

                    Anagrafica

       ELSE

             SELECT * from

             Anagrafica

             where Nome like '%' + @Nome + '%'

END


Terminata la creazione della SP e verificato il corretto funzionamento dobbiamo creare il progetto.


Creazione del progetto

Si crea un nuovo progetto di tipo Asp.Net Core MVC con versione del Framework 5.0.

Dopo aver aperto visual Studio 2019 Community, selezionare il modello “app web Asp.Net Core (Model-View-Controller) , il tutto come mostrato in figura 2



Figura  2 – Il modello da selezionare.


Facciamo click sul pulsante “Avanti” ed impostiamo un nome, di nuovo click sul pulsante “Avanti” e selezioniamo la versione 5.0, a questo punto click sul pulsante “Fine”.

Una volta creato il progetto, occorre aggiungere i riferimenti a Nuget, in particolare ad Entity Framework e precisamente a “Microsoft.EntityFrameworkCore.SqlServer”, il tutto come mostrato in figura 3.


Figura 3 – Il rifermento a Entity Framework Sql Server


Ora non resta che scrivere il codice per la gestione dei dati, creando classi appositamente per la gestione dell’entità e dei dati.

Stesura del codice

Si crea un nuova classe denominata “Anagrafica” che avrà la funzionalità di gestire i dati della tabella “Anagrafica” creata in precedenza.

La classe avrà le proprietà con lo stesso nome delle colonne della tabella e dello stesso tipo.

Qui di seguito la dichiarazione di tale classe.


public class Anagrafica

    {

 

     public   Int32 IDAnagrafica { get; set; }

        public  string Nome { get; set; }

 

        public string Cognome { get; set; }

 

        public string Ruolo { get; set; }

 

    }


Terminata la creazione della classe per la gestione dei dati, dobbiamo creare il contesto, ossia una classe che permette di gestire l’entità appena creata con la base dati, e quindi il mapping e la creazione del metodo per la ricerca dei dati, invocando la Stored Procedure appena creata.

La Stored Procedure sarà invocata utilizzando il metodo “FromSqlRaw” che è l’estensione dello spazio dei nomi di EntityFrameworkCore inserito precedentemente.

Si crea una nuova classe denominata “DBCtx” che dovrà gestire i dati.

La classe sarà come riportato qui di seguito.


C#

using System.Linq;

using Microsoft.EntityFrameworkCore;

 

namespace WebArtEFCore

{

    public class DBCtx : DbContext

    {

 

       

        public DBCtx(DbContextOptions<DBCtx> options)

           : base(options)

        {

        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)

        {

            modelBuilder.Entity<Anagrafica>(entita =>

            {

                entita.HasKey(p => p.IDAnagrafica);

 

            });

            }

 

        public DbSet<Anagrafica> Anagrafiche { get; set; }

 

        public IQueryable<Anagrafica> Ricerca(string Nome)

        {

            

            return this.Anagrafiche.FromSqlRaw("EXECUTE Trova {0}", Nome);

        }

    }

 

 

}



Come si è visto nel frammento di codice precedente, si è creata una classe che avrà il compito di fare da “ponte” tra l’applicativo ed il database, con questa classe che gestisce la fonte dati. A differenza di quando si usa l’autocomposizione di Entity Framework che crea in automatico la classe per il mapping, ossia la classe del contesto (DBcontext) in questo scenario siamo noi a creare la gestione della fonte dati.

Il metodo FromSqlRaw permette di eseguire stored procedure ed istruzioni SQL , nel nostro caso, esegue la nostra stored Procedure passando un valore.


La classe DbSet fornisce alla classe che abbiamo creato in precedenza i metodi per la gestione dell’entità nei confronti della base dati, che avviene tramite lo spazio dei nomi “Microsoft.EntityFrameworkCore”.


Ora che abbiamo terminato la parte di stesura codice per la gestione delle query e dell’estrapolazione dei dati, dobbiamo impostare la connessione al database, la connectionstring.

Facciamo click sul file denominato “appsettings.json” ed impostiamo il tag “ConnectionString”, qui di seguito si riporta il codice completo di questo file con la connessione alla base.


{

  "Logging": {

    "LogLevel": {

      "Default": "Information",

      "Microsoft": "Warning",

      "Microsoft.Hosting.Lifetime": "Information"

    }

  },

  "ConnectionStrings": {

    "MyConn": "Data Source=NomeServer\\SQLEXPRESS;Initial Catalog=Dati;Integrated security=true"

  },

  "AllowedHosts": "*"

}

Ora impostiamo il riferimento della connectionstrings alla nostra classe, andiamo nel file “Startup.cs” e nell’evento “ConfigureServices” aggiungiamo l’istruzione per impostare tale connessione alla nostra classe.

Qui di seguito il frammento di codice delle suddette dichiarazioni.


C#

public void ConfigureServices(IServiceCollection services)

        {

            services.AddControllersWithViews();

            services.AddMvc();

            string conStr = this.Configuration.GetConnectionString("MyConn");

            services.AddDbContext<DBCtx>(options => options.UseSqlServer(conStr));

        }


Ora dobbiamo gestire questi dati sia nella parte della pagina e sia nel controller.

Andiamo nel controller, nel file denominato “HomeController.cs” e dichiariamo un oggetto per questo controller che fa riferimento alla classe Context.

Qui di seguito le dichiarazione di quanto anticipato.


C#

DBCtx contesto;


Nel costruttore inizializziamo il nostro oggetto impostando il riferimento alla connectionStrings, qui di seguito tale dichiarazione.

C#

public HomeController(DBCtx _context)

        {

              contesto = _context;

        }


Ora non resta che creare negli eventi Index, il caricamento dei dati, in uno il caricamento di tutti dati quando si apre la pagina, mentre un altro evento index di tipo “Post” quando si vuole effettuare una ricerca per nome.

Qui di seguito i frammenti di codice delle suddette dichiarazioni.


C#

public IActionResult Index()

        {

         

        List<Anagrafica> Anagrafiche = contesto.Ricerca("").ToList();

            return View(Anagrafiche);

        }

 

        [HttpPost]

        public IActionResult Index(string Nome)

        {

 

            List<Anagrafica> Anagrafiche = contesto.Ricerca(Nome).ToList();

            return View(Anagrafiche);

        }

Ora passiamo nella parte view, in particolare nel file “Index.cshtml”, e scriviamo il codice per visualizzare a video una tabella con i dati ed i campi per la ricerca.

Qui di seguito si riporta il codice completo della pagina index con il quale vengono visualizzati i dati della base dati in forma tabellare.


Index.cshtml

 

@{

    ViewData["Title"] = "Home Page";

}

 

@model List<Anagrafica>;

 

 

<div class="text-center">

    <h1 class="display-4">Esempio di utilizzo SP</h1>

    <form method="post" asp-controller="Home" asp-action="Index">

        <span>Filtra per nome:</span><input type="text" name="Nome" />

        <input type="submit" value="Cerca" />

        <br />

        <br />

        <table cellpadding="0" cellspacing="0">

            <tr>

                <th>Id</th>

                <th>Nome</th>

                <th>Cognome</th>

                <th>Ruolo</th>

            </tr>

            @foreach (Anagrafica elemento in Model)

            {

                <tr>

                    <td>@elemento.IDAnagrafica</td>

                    <td>@elemento.Nome</td>

                    <td>@elemento.Cognome</td>

                    <td>@elemento.Ruolo</td>

                </tr>

            }

        </table>

    </form>

</div>


Il codice è facilmente comprensibile, dopo aver creato un oggetto di tipo list “Anagrafica” effettua un ciclo di tutti record creando una tabella. Tramite il metodo post di “Index” passando come valore il testo presente nella casella di testo, effettua la ricerca dei dati invocando la storedprocedure.


Conclusioni

L’articolo ha voluto fornire al lettore le basi per creare applicazioni web multipiattaforma con Asp.Net CORE MVC e l’uso di Entity Framework Core, senza utilizzo dell’autocomposizione ma creando tutto da codice la mappatura dei dati tra l’applicazione ed il database.

Un articolo che fornisce le basi per iniziare a scrivere applicazioni in questo ambito, che sarà sempre più utilizzato.