Skip to content

1. Introduzione

1.1. Obiettivo

Il PDF del documento è disponibile |QUI|.

Gli esempi nel documento sono disponibili |QUI|.

Entity Framework è un ORM (Object Relational Mapper) originariamente creato da Microsoft e ora disponibile come open source [luglio 2012, http://entityframework.codeplex.com/]. In un corso su ASP.NET, utilizzo la seguente architettura per una determinata applicazione web:

Il framework NHibernate [http://sourceforge.net/projects/nhibernate/] è un ORM che precede Entity Framework. Si tratta di un prodotto maturo che consente di connettersi a vari database. L'ORM isola il livello [DAO] (Data Access Objects) dal connettore ADO.NET. È l'ORM che invia i comandi SQL al connettore. Il livello [DAO], a sua volta, utilizza l'interfaccia fornita dall'ORM. Questa interfaccia dipende dall'ORM. Pertanto, cambiare l'ORM richiede la modifica del livello [DAO].

Questa architettura è resiliente ai cambiamenti nel DBMS.

Quando il livello [DAO] è collegato direttamente al connettore ADO.NET, la modifica del DBMS influisce sul livello [DAO]:

  • non tutti i DBMS hanno gli stessi tipi di dati;
  • i DBMS non utilizzano le stesse strategie per la generazione delle chiavi primarie;
  • i DBMS utilizzano un linguaggio SQL proprietario;
  • il livello [DAO] potrebbe aver utilizzato librerie legate a un DBMS specifico;
  • ...

Quando un ORM è collegato al connettore ADO.NET, cambiare il DBMS comporta semplicemente configurare l'ORM per adattarlo al nuovo DBMS. Il livello [DAO] rimane invariato.

Il framework Spring.NET [http://www.springframework.net/index.html] garantisce l'integrazione dei livelli di un'applicazione. Sopra:

  • l'applicazione ASP.NET richiede a Spring un riferimento al livello [DAO];
  • Spring utilizza un file di configurazione per creare questo livello e restituire il riferimento.

Questa architettura gestisce bene le modifiche ai livelli fintanto che questi continuano a esporre la stessa interfaccia. La modifica del livello [DAO] sopra riportato comporta la modifica del file di configurazione di Spring in modo che il nuovo livello venga istanziato al posto di quello vecchio. Poiché entrambi i livelli implementano la stessa interfaccia e il livello ASP.NET utilizza questa interfaccia, il livello ASP.NET rimane invariato.

Abbiamo quindi un'architettura flessibile e scalabile. Per dimostrarlo, sostituiremo l'ORM NHibernate con Entity Framework 5:

Procederemo in diverse fasi:

  • esploreremo Entity Framework 5 con diversi DBMS;
  • creeremo il livello [DAO2];
  • collegheremo l'applicazione ASP.NET esistente a questo nuovo livello [DAO].

1.2. Strumenti utilizzati

I test sono stati effettuati su un laptop HP EliteBook con sistema operativo Windows 7 Pro, dotato di un processore Intel Core i7 e 8 GB di RAM. Utilizzeremo C# come linguaggio di programmazione.

Questo documento utilizza i seguenti strumenti, tutti disponibili gratuitamente:

IDE di sviluppo:

  • Visual Studio Express for Desktop 2012 [http://www.microsoft.com/visualstudio/fra/downloads];
  • Visual Studio Express for Web 2012 [http://www.microsoft.com/visualstudio/fra/downloads].

Il DBMS SQL Server Express 2012:

  • il DBMS: [http://www.microsoft.com/fr-fr/download/details.aspx?id=29062];
  • uno strumento di amministrazione: EMS SQL Manager for SQL Server Freeware [http://www.sqlmanager.net/fr/products/mssql/manager/download].

Il DBMS Oracle Database Express Edition 11g Release 2:

  • il DBMS: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html];
  • uno strumento di amministrazione: EMS SQL Manager for Oracle Freeware [http://www.sqlmanager.net/fr/products/oracle/manager/download];
  • un client Oracle per .NET: ODAC 11.2 Release 5 (11.2.0.3.20) con Oracle Developer Tools per Visual Studio: [http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html].

Il DBMS MySQL 5.5.28:

  • il DBMS: [http://dev.mysql.com/downloads/];
  • uno strumento di amministrazione: EMS SQL Manager for MySQL Freeware [http://www.sqlmanager.net/fr/products/mysql/manager/download].

Il DBMS PostgreSQL 9.2.1:

  • il DBMS: [http://www.enterprisedb.com/products-services-training/pgdownload#windows];
  • uno strumento di amministrazione: EMS SQL Manager for PostgreSQL Freeware [http://www.sqlmanager.net/fr/products/postgresql/manager/download].

Il DBMS Firebird 2.1:

  • il DBMS: [http://www.firebirdsql.org/en/firebird-2-1-5/];
  • uno strumento di amministrazione: EMS SQL Manager for InterBase/Firebird Freeware [http://www.sqlmanager.net/fr/products/ibfb/manager/download].

LINQPad 4: uno strumento per imparare LINQ (Language INtegrated Query) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].

1.3. Codice sorgente

Il codice sorgente degli esempi che seguono è disponibile |QUI|.

Si tratta di progetti Visual Studio 2012 [1], raggruppati in una soluzione [2]. Nella cartella [databases] è presente una cartella per ciascun DBMS utilizzato. Queste cartelle contengono gli script SQL per la generazione del database di esempio per tali DBMS.

1.4. L'approccio

Per imparare a conoscere Entity Framework 5 Code First, ho iniziato con il seguente libro: "Professional ASP.NET MVC 3" di Jon Galloway, Phil Haack, Brad Wilson e Scott Allen, pubblicato da Wrox. Nell'applicazione di esempio del libro, gli autori utilizzano Entity Framework (EF) come ORM. Dato che non lo conoscevo, ho cercato sul web per saperne di più. Ho scoperto che la versione più recente era EF 5 e che c'erano incompatibilità con EF 4, poiché il codice del libro, quando testato con EF 5, produceva errori di compilazione.

Ho poi scoperto che ci sono diversi modi per utilizzare EF:

  • Model First: ci sono molti articoli su questo approccio a EF, ad esempio [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. Questo articolo inizia così:

Sommario: In questo documento, esamineremo il nuovo Entity Framework 4 fornito con .NET Framework 4 e Visual Studio 2010. Discuterò come è possibile affrontarne l'utilizzo da una prospettiva Model First, partendo dal presupposto che sia possibile guidare la progettazione del database a partire da un modello e costruire sia il database che il livello di accesso ai dati in modo dichiarativo a partire da questo modello. Il modello contiene la descrizione dei dati rappresentati come entità e relazioni, fornendo un approccio potente per lavorare con ADO.NET e creando una separazione dei livelli attraverso un'astrazione tra la definizione del modello e la sua implementazione.

Un ORM colma il divario tra le tabelle del database e le classi.

Sopra,

  • a sinistra del livello EF5, abbiamo gli oggetti, che chiamiamo entità;
  • a destra del livello EF5, abbiamo le tabelle del database.

Il livello [DAO] opera con oggetti che rappresentano le tabelle del database. Questi oggetti sono raggruppati all'interno di un contesto di persistenza e sono chiamati entità (Entity). Le modifiche apportate alle entità si riflettono, tramite l'ORM, nelle tabelle del database (inserimento, modifica, eliminazione). Inoltre, il livello [DAO] utilizza un linguaggio di query integrato chiamato LINQ to Entities (Language-Integrated Query) che interroga le entità anziché le tabelle. L'approccio Model-First prevede la creazione di entità utilizzando uno strumento grafico. Si definisce ogni entità e le relazioni che la collegano alle altre. Una volta fatto questo, lo strumento genera:

  • le varie classi che riflettono le entità costruite graficamente;
  • il DDL (Data Definition Language) utilizzato per generare il database.

Tutti gli esempi che ho trovato per questo metodo utilizzavano Visual Studio 2010 Professional e un modello denominato ADO.NET Entity Data Model. Sono riuscito a testare questo modello con Visual Studio 2010 Professional, ma quando sono passato a Visual Studio Express 2012 — che era la mia versione di destinazione — ho scoperto che questo modello non era più disponibile. Ho quindi abbandonato questo approccio.

  • Database First: il punto di partenza di questo metodo è un database esistente. Da lì, uno strumento genera automaticamente i modelli di entità per le tabelle del database. Anche in questo caso, gli esempi che ho trovato, come [http://msdn.microsoft.com/en-us/data/gg685489.aspx], utilizzano Visual Studio 2010 Professional e l'ADO.NET Entity Data Model. Quindi ho abbandonato anche questo approccio, sebbene fosse il mio preferito. Per determinare quali entità utilizzare come rappresentazioni di un database esistente, era facile partire da uno strumento che le generasse.
  • Code First: si scrivono da soli le classi che formeranno le entità. Ciò richiede almeno una comprensione di base di come funziona EF. Questo è l'approccio che ho adottato perché era compatibile con Visual Studio Express 2012.

Tenendo presente questo, ho lavorato come segue:

  • ho scritto il codice per SQL Server Express 2012 perché è il DBMS per cui sono disponibili la maggior parte degli esempi;
  • una volta che questo codice è stato sottoposto a debug, l'ho portato sugli altri DBMS (Firebird, Oracle, MySQL, PostgreSQL).

Qui procederemo in modo diverso. Descriverò prima tutto il codice per SQL Server, poi descriverò come è stato portato sugli altri DBMS. In questo processo di porting sono state apportate le seguenti modifiche:

  • i database hanno caratteristiche proprietarie. In particolare, ho utilizzato i trigger per generare automaticamente il contenuto di alcune colonne. Ogni DBMS ha il proprio modo di gestire questo aspetto;
  • le entità immagine nelle tabelle potrebbero cambiare, ma ciò è intenzionale. Avrei potuto scegliere entità adatte a tutti i database;
  • il driver ADO.NET per il DBMS cambia;
  • la stringa di connessione al DBMS cambia.

L'approccio adottato è il seguente:

  • mappatura entità/database. Popolare il database;
  • Dump del database utilizzando query LINQ;
  • LINQPad, uno strumento per l'apprendimento di LINQ;
  • Aggiunta, eliminazione e modifica delle entità;
  • gestione dell'accesso simultaneo;
  • contesto di persistenza salvato all'interno di una transazione;
  • Modifica di un'entità al di fuori del contesto di persistenza;
  • Caricamento immediato e differito;
  • creazione del livello [DAO];
  • Costruzione del livello web ASP.NET.

1.5. Destinatari

Questo documento è destinato ai principianti.

Questo documento non è un corso su Entity Framework 5 Code First. A tal fine, potresti voler leggere, ad esempio, "Programming Entity Framework: Code First" di Julie Lerman e Rowan Miller, pubblicato da O'Reilly. Questo documento non mira ad essere esaustivo, ma delinea semplicemente l'approccio che ho utilizzato per comprendere questo ORM. Ritengo che questo approccio possa essere utile ad altri che lavorano con EF5. Il mio obiettivo non va oltre questo ambito.

1.6. Articoli correlati su developpez.com

Il libro citato sopra servirà da riferimento. Su developpez.com sono presenti anche articoli dedicati a Entity Framework. Eccone alcuni:

Come indicato sopra, questo documento non è esaustivo. I lettori trarranno beneficio dalla consultazione degli articoli sopra elencati per colmare alcune lacune. La mia ricerca potrebbe essere stata incompleta. Mi scuso con gli autori che potrei aver tralasciato.