ado.net entity framework 4
TRANSCRIPT
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 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à
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(); }
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
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
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