E’ da qualche tempo che avrei voluto scrivere qualche post a riguardo della nuova versione dell’Entity Framework, ma per vari motivi ho sempre dovuto rimandare. Finalmente, il momento è arrivato. Durante, il corso dell’anno precedente mi sono trovato ad utilizzare Entity Framework in molti progetti, di piccola e media complessità e devo essere sincero: nonostante i problemi di gioventù (testing ad esempio…), alla fine, ho avuto modo di apprezzare, soprattutto in fase di manutenzione del software, il tempo risparmiato, se dovessi paragonare la stessa tipologia di lavoro utilizzando DataSet tipizzati invece di “Entità”. E’ vero anche, che al fine di disaccoppiare il più possibile i layer logici, è stato necessario dover scrivere (in alcuni casi, non poco) codice per gestire correttamente la situazione, e non dover portarsi dietro sia a livello di progetto che a runtime, tutti i vari riferimenti necessari ai vari EntityObject per funzionare (la situazione potrebbe complicarsi se il DAL si trovasse su un tier completamente diverso da quello della BLL). Vediamo una delle nuove funzionalità introdotte con la nuova versione di Entity Framework: la possibilità di utilizzare un approccio Model First: la generazione concettuale del modello prima del modello di storage (il database in questo caso).
Supponiamo, di voler creare una semplice applicazione per la gestione di un’anagrafica composta da persone ed enti. Le specifiche della nostra applicazione indicano che una persona può essere collegata a più società e che una società può avere più persone, una tipica relazione molti-a-molti. In un approccio data-driven, a questo punto, la prima cosa che faremmo sarebbe aprire (ad esempio) SQL Server Management Studio e progettare le tabelle con le varie relazioni, poi aprire Visual Studio, e nel caso dovessimo utilizzare Entity Framework aggiungere al nostro progetto un file con estensione .edmx. Utilizzando un approccio Model-First, apriamo immediatamente Visual Studio 2010 Beta 2 e creiamo un nuovo progetto console (ad esempio) che potremmo chiamare con molta fantasia EF2Features:
Aggiungiamo al nostro progetto un nuovo item di tipo ADO.NET Entity Data Model che potremmo chiamare PersoneEntiModel (di conseguenza verrà generato il file PersoneSocietaModel.edmx)
Dopo aver fatto click su “Add” verrà visualizzato un Wizard attraverso il quale possiamo scegliere se creare un modello a partire da un database o partire da un modello vuoto, scegliamo la seconda opzione:
Bene, a questo punto, possiamo trascinare dalla casella degli strumenti presente (generalmente) a sinistra di Visual Studio due item Entity nel nostro designer, che chiameremo Persona ed Ente, assegnando rispettivamente le proprietà Nome, Cognome, ed Indirizzo a Persona, Nome e Sigla ad Ente. Per default le due entità presentano una proprietà Id di tipo Int32, le quali sono anche chiavi (Entity Key). Piccola osservazione: la proprietà StoreGeneratedPattern è per default impostata su none: questo vuol dire che il valore della chiave non verrà in alcun caso (insert or update) recuperato dal server quando verrà chiamato il metodo SaveChanges. Impostiamo invece il valore della proprietà su Identity: in questo caso si assume che il valore della chiave verrà recuperato durante il primo inserimento, successivamente si assume che il valore non cambierà. Maggiori dettagli sono disponibili su: http://msdn.microsoft.com/en-us/library/bb738536(VS.100).aspx
A questo punto non ci resta che creare l’associazione tra Persona ed Ente: sempre dalla Toolbox, selezioniamo l’item Association e colleghiamo le nostre due entità, specificando, tramite la finestra delle proprietà, relativamente a Persona ed Ente che agli estremi dell’associazione troveremo una collezione di oggetti, secondo del verso di lettura, di tipo Persona o Ente.
A questo punto non ci resta che creare il nostro database. In “Server Explorer” facciamo click su “Data Connections” e poi “Create New SQL Server Database…” (in alternativa possiamo utilizzare i tools a riga di comando….):
Dopo aver create il nostro database, passiamo alla generazione dello script da utilizzare per la creazione: tasto destro del mouse in un punto del designer, e dal menu contestuale “Generate Database Script from Model….”:
Visual Studio genererà uno script DDL (Database Defintion Lanaguage) da utilizzare per creare le tabelle del nostro DB:
Dopo aver premuto Finish, nel nostro progetto verrà aggiunto il file DDL (PersoneEntiModel.edmx.sql) generato che può essere eseguito: direttamente da Visual Studio, tramite SQL Server Management Studio o tool da rigo di comando. In questo caso ho optato per la prima possibilità. Dopo l’esecuzione dello script, espandendo il nodo tables nel “Server Explorer”, otteniamo quanto segue:
Notiamo che per soddisfare la relazione molti-a-molti tra Persona ed Ente è stata generata una terza tabella PersoneEnte (tabella d’associazione). Per verificare ulteriormente il risultato prodotto possiamo creare un nuovo diagramma per meglio visualizzare la relazione creata tra le tabelle:
Soddisfacendo gli obiettivi preposti.
Questa è solo una delle novità introdotte con la nuova versione dell’ Entity Framework V.2, tra cui: “POCO Templates” e supporto per il Test-Driven-Development.