ADO.NET Entity Framework 4

30
Entity Framework Raffaele Fanizzi www.skyraysolutions.com Vicepresidente e Technical Architect, Skyray Solutions SRL MCPD & MCTS

Transcript of ADO.NET Entity Framework 4

Entity Framework

Raffaele Fanizziwww.skyraysolutions.comVicepresidente e Technical Architect, Skyray Solutions SRLMCPD & MCTS

Agenda

o Introduzioneo Operazioni sul databaseo Gestione delle connessionio Gestione delle transazionio Lazy loadingo POCOo Q&A

Introduzione

o Un framework di Object Relational Mapping (ORM) ha l’obiettivo di avvicinare la logica di interfacciamento alle basi di dati, alla logica della programmazione orientata agli oggetti

o Vantaggi

o Consente di colmare il gap che esiste tra il modello relazionale ed il modello object oriented

o Riduce drasticamente il codice scritto per interfacciarsi ai database

o Permette di rendere lo strato di accesso ai dati indipendente dallo specifico RDBMS utilizzato

o Favorisce lo spostamento della logica applicativa dalle stored procedure al codice

Introduzione

o select (select max(answer.answer) from answer where answer.member_id in (select member_id from team_members where project_id in ( select project_id from project where Business_stream='Upstream' and stage='Appraise' and project_id in (select project_id from projectextra where subteam<>1 ) ) ) and answer.page_id=page.page_id) as thinl, (select max(avgscore) from task_projectwhere task_project.project_id not in (select project_id from projectextra where subteam=1 ) and task_project.project_id in (select project_id from project where stage='Appraise' and Business_stream = 'Upstream') and task_project.page_id=page.page_id) as bmax, (select max(answer) from answer where answer.page_id=page.page_id) as datamax, (select avg(avgscore) from task_project where project_id=1 and task_project.page_id=page.page_id) as projavg, (select avg(avgscore) from task_project where project_id not in (select project_id from projectextra where subteam=1) and task_project.page_id=page.page_id) as companyavg, (select avg(avgscore) from task_project where project_id not in (select project_id from projectextra where subteam=1) and project_id in (select project_id from project where Business_stream = 'Upstream') and task_project.page_id=page.page_id) as businessavg, page.* from page,riverorder where page.category_name='Business Boundaries' and stage_name='Appraise' and riverorder.category_name=page.category_name order by riverorder.riverorder,page.order_id select (select max(answer.answer) from answer where answer.member_id in ( select member_id from team_members where project_id in ( select project_id from project where Business_stream='Upstream' and stage='Appraise' and project_id in (select project_id from projectextra where subteam<>1 ) ) ) and answer.page_id=page.page_id) as thinl, (select max(avgscore) from task_project where task_project.project_id not in (select project_id from projectextra where subteam=1 ) and task_project.project_id in (select project_id from project where stage='Appraise' and Business_stream = 'Upstream') and task_project.page_id=page.page_id) as bmax, (select max(answer) from answer where answer.page_id=page.page_id) as datamax, (select avg(avgscore) from task_project where project_id=1 and task_project.page_id=page.page_id) as projavg, (select avg(avgscore) from task_project where project_id not in (select project_id from projectextra where subteam=1) and task_project.page_id=page.page_id) as companyavg, (select avg(avgscore) from task_project where project_id not in (select project_id from projectextra where subteam=1) and project_id in (select project_id from project where Business_stream = 'Upstream') and task_project.page_id=page.page_id) as businessavg, page.* from page,riverorder where page.category_name='Business Boundaries' and stage_name='Appraise' and riverorder.category_name=page.category_name order by riverorder.riverorder,page.order_id

o A cosa serve quindi un ORM ?

Introduzione

o ADO.NET Entity Framework è la proposta di Microsoft nel mercato degli Object Relational Mapper (ORM)

o Storia

o V1 - .NET Framework 3.5 SP1

o V4 - .NET Framework 4

Introduzione

o ADO.NET Entity Framework basa il suo funzionamento su un Entity Data Model composto dai seguenti tre schema XML:

o Conceptual schema definition language (CSDL)

o Definisce lo schema concettuale del modello object oriented dei dati

o Store schema definition language (SSDL)

o Definisce lo schema di persistenza su database dei dati

o Mapping specification language (MSL)

o Definisce il mapping tra CSDL e SSDL

Introduzione

o E’ possibile generare l’Entity Data Model in tre modi:

o Database first

o Visual Studio li genera a partire da un database già esistente

o Di default per ogni tabella viene generata una classe e le relazioni tra le tabelle diventano navigation properties

o Model first (introdotto con Visual Studio 2010)

o Si usa il designer di Visual Studio per realizzare prima il modello concettuale e successivamente generare gli script per il database

o Code first (a partire da Entity Framework CTP 4)

o Si parte dalle classi del proprio modello

Introduzione

o Architettura layered

o Object Services

o Forniscono l’accesso ai dati mediante l’ObjectContext e “contenitori di oggetti” denominati ObjectSet

o EntityClient Data Provider

o Gestisce le connessioni e converte le query dal modello concettuale al modello fisico utilizzando l’EDM

o ADO.NET Data Providers

o Eseguono l’accesso al database

Introduzione

o ADO.NET Entity Framework è un’API indipendente dal database sottostante

o Un database, per essere compatibile, deve fornire un provider ADO.NET in grado di supportare Entity Framework

o Il .NET Framework 3.5 SP1 o superiore integra un provider per l’accesso ai dati (SqlClient) compatibile con SQL Server 2000, 2005, 2008 e Azure

o Esistono provider (gratuiti o a pagamento) per tutti i più diffusi RDBMS: Oracle, MySql, PostgreSQL, DB2, SQLite, Sybase, ecc…

Operazioni sul database

o L’interrogazione al modello concettuale è possibile sfruttando tre diversi formalismi:

o Entity SQL

o Query Builder Method

o LINQ to Entities

Operazioni sul database

o Entity SQL

o E’ il modo più prestante di eseguire interrogazioni mediante l’Entity Framework

o E’ un linguaggio SQL-like molto simile a T-SQL, usato per interrogare il modello concettuale

string selectCustomers = "SELECT VALUE Customer From NorthwindEntities.Customers as Customer where Customer.CustomerID = @id";

ObjectQuery<Customers> query = new ObjectQuery<Customers>(selectCustomers, entities);

query.Parameters.Add(new ObjectParameter("id", "ALFKI"));

Operazioni sul database

o Query Method

o Rappresentano una serie di metodi disponibili per

l’ObjectSet che facilitano la costruzione di query rispetto

all’uso diretto dell’Entity SQL

o E’ una soluzione che si pone in posizione intermedia tra

LINQ e l’Entity SQL

o I metodi di query sono ottimizzati per introdurre un

overhead minimo rispetto all’Entity SQLvar query = entities.Customers.Where("it.CustomerID = @id", new ObjectParameter("id", "ALFKI"));

Operazioni sul database

o LINQ to Entities

o Poiché gli ObjectSet implementano l’interfaccia IQuerable, possono essere interrogati utilizzando LINQ sia con la method syntax, che con la query syntax

//method syntaxvar customers =  entities.Customers.Where(c => c.CustomerID == "ALFKI");

//query syntaxvar customers = from customer in entities.Customers

where customer.CustomerID == “ALFKI” select customer;

Operazioni sul database

o L’esecuzione delle interrogazioni su database viene effettivamente eseguita solo nei seguenti casi:

o Viene enumerato il risultato della query

o Viene applicato l’operatore First o Any con LINQ

o La query è, pertanto, eseguita solo quando i suoi risultati sono effettivamente necessarivar customers = entities.Customers.Where(c => c.CustomerID == "ALFKI")

;

foreach (var customer in customersWithOrders) { … }

Esecuzione query

Operazioni sul database

o Demo

Operazioni sul database

o Create

o L’operazione di create, cioè di inserimento di un nuovo record è supportata semplicemente creando una nuova istanza della classe corrispondente ed aggiungendola all’ObjectContext con il metodo AddObject

o Delete

o Analogamente all’operazione di inserimento, la cancellazione è supportata richiamando semplicemente il metodo DeleteObject dell’ObjectContext

Customers customer = new Customers();customer.CustomerID = "KILOP";customer.CompanyName = "Kilop";entities.Customers.AddObject(customer);

entities.Customers.DeleteObject(customer);

Operazioni sul database

o Update

o Normalmente l’ObjectContext tiene traccia dello stato di tutti gli oggetti restituiti da una interrogazione

o Questa funzionalità gli consente di persistere su database le modifiche effettuate sulle proprietà degli oggetti

o Persistenza

o Le operazioni di Insert, Update e Delete vengono persistite solo alla chiamata del metodo SaveChanges dell’ObjectContext

o Il metodo SaveChanges viene sempre eseguito in transazione

o Se un’operazione comporta una modifica ad altre tuple del database (ad esempio attraverso trigger), è necessario chiamare il metodo Refresh per aggiornare lo stato delle entità

Operazioni sul database

o Demo

Gestione delle connessioni

o ADO.NET Entity Framework apre e chiude le connessioni automaticamente per il tempo strettamente necessario all’esecuzione di un’operazione

o E’ possibile anche gestire manualmente le connessioni, ma in tal caso è necessario ricordarsi di richiamare il metodo Close o Dispose affinché Entity Framework riprenda a gestirle automaticamente

Gestione delle transazioni

o Analogamente ad ADO.NET, Entity Framework supporta la gestione delle transazioni in due modalità:

o Gestendo manualmente la connessione

o Utilizzando le classi del namespace System.Transactions (ad esempio TransactionScope)

Gestione delle transazioni

o Gestione manuale delle connessioni            entities.Connection.Open();            var transaction = entities.Connection.BeginTransaction();            try            {                                Customers customer = new Customers();                customer.CustomerID = "KILOP";                customer.CompanyName = "Kilop";                entities.Customers.AddObject(customer);

                entities.Customers.DeleteObject(customer2);

                transaction.Commit();            }            catch (Exception)            {                transaction.Rollback();            }            finally            {                entities.Connection.Close();            }

Gestione delle transazioni

o Utilizzando System.Transactions

            using (TransactionScope scope = new TransactionScope())            {                Customers customer = new Customers();                customer.CustomerID = "KILOP";                customer.CompanyName = "Kilop";                entities.Customers.AddObject(customer);

                entities.Customers.DeleteObject(customer2);                entities.SaveChanges();

                scope.Complete();            }

Gestione delle transazioni

o Demo

Lazy loading

o Utilizzando ADO.NET Entity Framework il risultato di una interrogazione è rappresentato da un oggetto o da una collezione

o Le relazioni tra le tabelle del database nel modello ad oggetti sono rappresentate da navigation property, cioè da proprietà delle classi che referenziano altri oggetti

o Entity Framework 4 introduce il concetto di Lazy Loading: i dati di un oggetto relazionato vengono caricati solo se e quando viene richiamato il get della navigation propertyvar customers = entities.Customers.Where(c => c.CustomerID == "ALFKI");var customerFound = customers.First();var orders = customerFound.Orders.ToList();

Lazy loading

Lazy loading

o Demo

POCO

o Normalmente Visual Studio a partire da un EDMX, genera una serie di classi che rappresentano le entità del modello concettuale

o Queste classe ereditano da EntityObject e sono oggetti piuttosto complessi:

o Numerosi attributi, partial method, INotifyPropertyChanged, ecc….

o Utilizzare tali oggetti in tutta l’applicazione la rende fortemente dipendente dalla specifica tecnologia di accesso ai dati utilizzata e potrebbe non essere la soluzione ottimale quando si vogliono esporre servizi WCF

o Visual Studio 2010 e Entity Framework 4 introducono il supporto ai Plain Old CLR Object, cioè all’uso di classi semplici da utilizzare come modello concettuale

o Per implementare i POCO si adopera l’ADO.NET Entity POCO Generator

POCO

o Demo

Risorse

o MSDNhttp://msdn.microsoft.com

o ADO.NET Team Bloghttp://blogs.msdn.com/b/adonet/

o LINQ to Entities Debug Visualizerhttp://www.rajavenkatesh.com

o ADO.NET Entity Framework – Wikipediahttp://en.wikipedia.org/wiki/ADO.NET_Entity_Framework

o DotNetSidehttp://dotnetside.org

o Il mio bloghttp://www.vifani.com

Q & A

Domande ?

Grazie per l’attenzione