Skip to content

1. Introduzione

1.1. Objectif

Il PDF del documento è disponibile |QUI|.

Gli esempi del documento sono disponibili |QUI|.

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

Il framework NHibernate [http://sourceforge.net/projects/nhibernate/] è un ORM apparso prima di Entity Framework. Si tratta di un prodotto maturo che consente di connettersi a diversi 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] utilizza a sua volta l’interfaccia fornita dall’ORM. Quest’ultima dipende dall’ORM. Pertanto, cambiare l’ORM comporta la modifica del livello [DAO].

Questa architettura resiste bene alle modifiche apportate a SGBD.

Quando si collega il livello [DAO] direttamente al connettore ADO.NET, la modifica di SGBD ha un impatto sul livello [DAO]:

  • i SGBD non hanno tutti gli stessi tipi di dati;
  • i SGBD non hanno le stesse strategie di generazione delle chiavi primarie;
  • i SGBD contengono SQL proprietari;
  • il livello [DAO] potrebbe aver utilizzato librerie collegate a un SGBD specifico;
  • ...

Quando è un ORM ad essere collegato al connettore ADO.NET, cambiare il SGBD equivale a modificare la configurazione del ORM per adattarla al nuovo SGBD. Il livello [DAO] rimane invariato.

Il framework Spring.NET [http://www.springframework.net/index.html] garantisce l’integrazione dei livelli di un’applicazione. Nell’esempio sopra riportato:

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

Questa architettura resiste bene alle modifiche dei livelli, purché questi presentino sempre la stessa interfaccia. Modificare il livello [DAO] sopra riportato consiste nel modificare il file di configurazione di Spring affinché il nuovo livello venga istanziato al posto di quello precedente. Poiché entrambi implementano la stessa interfaccia e lo strato ASP.NET utilizza tale interfaccia, lo strato ASP.NET rimane invariato.

Si tratta quindi di un’architettura flessibile e scalabile. Per dimostrarlo, sostituiremo ORM e NHibernate con Entity Framework 5:

Procederemo in diverse fasi:

  • scopriremo Entity Framework 5 con diversi SGBD;
  • costruiremo il livello [DAO2];
  • collegheremo l’applicazione esistente ASP.NET a questo nuovo livello [DAO].

1.2. Gli strumenti utilizzati

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

Il documento utilizza i seguenti strumenti, tutti disponibili gratuitamente:

Strumenti di sviluppo:

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

SGBD SQL Server Express 2012:

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

SGBD Oracle Database Express Edition 11g Release 2:

  • SGBD: [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 SGBD MySQL 5.5.28:

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

Il SGBD PostgreSQL 9.2.1:

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

SGBD Firebird 2.1:

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

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

1.3. I codici sorgente

I codici sorgente degli esempi che seguiranno sono disponibili su URL [http://tahe.developpez.com/dotnet/ef5cf].

Si tratta di progetti Visual Studio 2012 [1], raggruppati in una soluzione [2]. In una cartella [databases] si troverà una cartella per ogni SGBD utilizzato. Al suo interno sono presenti gli script SQL per la generazione del database di esempio per questi SGBD.

1.4. Il metodo

Per scoprire Entity Framework 5 Code First, ho iniziato dal seguente libro: "Professional ASP.NET MVC 3" di Jon Galloway, Phil Haack, Brad Wilson e Scott Allen, edito da Wrox. Nell’applicazione di esempio di questo libro, gli autori utilizzano Entity Framework (EF) come ORM. Dato che non ne sapevo nulla, ho cercato in rete per saperne di più. Ho così scoperto che la versione più recente era la 5 e che c’erano delle incompatibilità con la versione 4, poiché il codice del libro, testato con la versione 5, presentava errori di compilazione.

Ho poi scoperto che esistono diversi modi per utilizzare EF:

  • Model First: esistono numerosi articoli su questo approccio a EF, ad esempio [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. L’articolo si apre con la seguente introduzione:

Sommario: In questo articolo esamineremo il nuovo Entity Framework 4, fornito con .NET Framework 4 e Visual Studio 2010. Illustrerò 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 tale 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 di astrazione tra la definizione del modello e la sua implementazione.

Un ORM funge da ponte tra le tabelle del database e le classi.

Sopra,

  • a sinistra del livello EF5, ci sono degli oggetti, chiamati entità;
  • a destra del livello EF5, si trovano le tabelle del database.

Il livello [DAO] opera con oggetti immagine delle tabelle del database. Questi oggetti sono raggruppati in un contesto di persistenza e sono denominati entità (Entity). Le modifiche apportate alle entità vengono propagate, tramite il livello ORM, alle tabelle del database (inserimento, modifica, eliminazione). Inoltre, il livello [DAO] dispone di un linguaggio di interrogazione LINQ to Entity (Language INtegrated Query) che esegue query sulle entità e non sulle tabelle. Il metodo Model First consiste nel costruire le entità con uno strumento grafico. Si definisce ogni entità e le relazioni che la legano alle altre. Una volta fatto ciò, uno strumento permette di generare:

  • le diverse classi che rispecchiano le entità costruite graficamente;
  • il DDL (Data Definition Language) che consente di generare il database.

Gli esempi che ho trovato su questo metodo utilizzavano tutti Visual Studio 2010 Professional e un modello denominato ADO.NET Entity Data Model. Ho potuto testare questo modello con Visual Studio 2010 Professional, ma quando sono passato a Visual Studio Express 2012, che era il mio obiettivo, ho constatato che tale modello non era più disponibile. Ho quindi abbandonato questo approccio.

  • Database First: il punto di partenza di questo metodo è un database esistente. Partendo da lì, uno strumento genera automaticamente le entità corrispondenti alle tabelle del database. Anche in questo caso gli esempi trovati, ad esempio [http://msdn.microsoft.com/en-us/data/gg685489.aspx], utilizzano Visual Studio 2010 Professional e il modello ADO.NET Entity Data Model. Ho quindi abbandonato anche questo approccio, che pure era il mio preferito. Per sapere quali entità utilizzare come rappresentazione di un database esistente, era semplice iniziare con uno strumento che le generasse.
  • Code First: si scrivono autonomamente le classi che andranno a costituire le entità. È quindi necessario avere una conoscenza di base del funzionamento di EF. È la strada che ho seguito perché era utilizzabile con Visual Studio Express 2012.

Una volta acquisite queste nozioni, ho proceduto nel modo seguente:

  • scrivevo il codice per SQL Server Express 2012, poiché è per questa versione di SGBD che si trova il maggior numero di esempi;
  • una volta debuggato questo codice, lo portavo sugli altri SGBD (Firebird, Oracle, MySQL, PostgreSQL).

In questo caso procederemo in modo diverso. Descriverò innanzitutto l’insieme dei codici per SQL Server, quindi descriverò il loro adattamento agli altri SGBD. In questo adattamento vengono apportate le seguenti modifiche:

  • i database presentano caratteristiche proprietarie. In particolare, ho utilizzato dei trigger per generare automaticamente il contenuto di alcune colonne. Ogni SGBD ha il proprio modo di gestire questo aspetto;
  • le entità immagine delle tabelle possono variare, ma in tal caso si tratta di una scelta deliberata. Avrei potuto scegliere entità adatte a tutti i database;
  • il driver ADO.NET del SGBD cambia;
  • La stringa di connessione al SGBD cambia.

La procedura adottata è la seguente:

  • associazione entità / database. Popolamento del database;
  • dump del database con le query LINQ;
  • LINQPad, uno strumento di apprendimento di LINQ;
  • aggiunta, eliminazione, modifica di entità;
  • gestione della concorrenza di accesso;
  • contesto di persistenza salvato in una transazione;
  • modifica di un'entità al di fuori del contesto di persistenza;
  • Eager e Lazy loading;
  • costruzione del livello [DAO];
  • costruzione del livello web ASP.NET.

1.5. Destinatari

Il pubblico di riferimento è costituito dai principianti.

Questo documento non è un corso su Entity Framework 5 Code First. A tal fine, si può consultare ad esempio "Programming Entity Framework: Code First", di Julie Lerman e Rowan Miller, edito da O'Reilly. Il documento non pretende in alcun modo di essere esaustivo, ma espone semplicemente l'approccio che ho utilizzato per comprendere questo ORM. Ritengo che tale approccio possa essere utile ad altre persone che si avvicinano a EF5. Il mio obiettivo non va oltre questo ambito.

1.6. Articoli correlati su developpez.com

Il libro citato sopra servirà da riferimento. Esistono inoltre articoli dedicati a Entity Framework su developpez.com. Eccone alcuni:

Come indicato in precedenza, il presente documento non è esaustivo. Si consiglia di leggere gli articoli sopra citati per colmare alcune lacune. La mia ricerca potrebbe essere incompleta. Chiedo scusa agli autori che potrei aver tralasciato.