ado.net entity framework 4

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

Author: raffaele-fanizzi

Post on 24-Jun-2015

229 views

Category:

Technology


2 download

Embed Size (px)

TRANSCRIPT

Entity Framework

Raffaele Fanizziwww.skyraysolutions.comVicepresidente e Technical Architect, Skyray Solutions SRLMCPD & MCTS1AgendaIntroduzioneOperazioni sul databaseGestione delle connessioniGestione delle transazioniLazy loadingPOCOQ&AIntroduzioneUn framework di Object Relational Mapping (ORM) ha lobiettivo di avvicinare la logica di interfacciamento alle basi di dati, alla logica della programmazione orientata agli oggettiVantaggiConsente di colmare il gap che esiste tra il modello relazionale ed il modello object orientedRiduce drasticamente il codice scritto per interfacciarsi ai databasePermette di rendere lo strato di accesso ai dati indipendente dallo specifico RDBMS utilizzatoFavorisce lo spostamento della logica applicativa dalle stored procedure al codice

Introduzioneselect (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 subteam1 ) ) ) 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 subteam1 ) ) ) 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

A cosa serve quindi un ORM ? IntroduzioneADO.NET Entity Framework la proposta di Microsoft nel mercato degli Object Relational Mapper (ORM)StoriaV1 - .NET Framework 3.5 SP1V4 - .NET Framework 4

IntroduzioneADO.NET Entity Framework basa il suo funzionamento su un Entity Data Model composto dai seguenti tre schema XML:Conceptual schema definition language (CSDL)Definisce lo schema concettuale del modello object oriented dei datiStore schema definition language (SSDL)Definisce lo schema di persistenza su database dei datiMapping specification language (MSL)Definisce il mapping tra CSDL e SSDLIntroduzioneE possibile generare lEntity Data Model in tre modi:Database firstVisual Studio li genera a partire da un database gi esistente Di default per ogni tabella viene generata una classe e le relazioni tra le tabelle diventano navigation propertiesModel first (introdotto con Visual Studio 2010)Si usa il designer di Visual Studio per realizzare prima il modello concettuale e successivamente generare gli script per il databaseCode first (a partire da Entity Framework CTP 4)Si parte dalle classi del proprio modello

IntroduzioneArchitettura layeredObject ServicesForniscono laccesso ai dati mediante lObjectContext e contenitori di oggetti denominati ObjectSetEntityClient Data ProviderGestisce le connessioni e converte le query dal modello concettuale al modello fisico utilizzando lEDMADO.NET Data ProvidersEseguono laccesso al database

IntroduzioneADO.NET Entity Framework unAPI indipendente dal database sottostanteUn database, per essere compatibile, deve fornire un provider ADO.NET in grado di supportare Entity FrameworkIl .NET Framework 3.5 SP1 o superiore integra un provider per laccesso ai dati (SqlClient) compatibile con SQL Server 2000, 2005, 2008 e AzureEsistono provider (gratuiti o a pagamento) per tutti i pi diffusi RDBMS: Oracle, MySql, PostgreSQL, DB2, SQLite, Sybase, ecc

Operazioni sul databaseLinterrogazione al modello concettuale possibile sfruttando tre diversi formalismi:Entity SQLQuery Builder MethodLINQ to Entities

Operazioni sul databaseEntity SQLE il modo pi prestante di eseguire interrogazioni mediante lEntity FrameworkE un linguaggio SQL-like molto simile a T-SQL, usato per interrogare il modello concettuale

stringselectCustomers="SELECTVALUECustomerFro[email protected]id";

ObjectQueryquery=newObjectQuery(selectCustomers,entities);

query.Parameters.Add(newObjectParameter("id","ALFKI"));Operazioni sul databaseQuery MethodRappresentano una serie di metodi disponibili per lObjectSet che facilitano la costruzione di query rispetto alluso diretto dellEntity SQLE una soluzione che si pone in posizione intermedia tra LINQ e lEntity SQLI metodi di query sono ottimizzati per introdurre un overhead minimo rispetto allEntity SQL

varquery=entities.Customers.Where("[email protected]",newObjectParameter("id","ALFKI"));Operazioni sul databaseLINQ to EntitiesPoich gli ObjectSet implementano linterfaccia IQuerable, possono essere interrogati utilizzando LINQ sia con la method syntax, che con la query syntax

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

//query syntaxvar customers = from customer in entities.Customers where customer.CustomerID == ALFKI select customer;Operazioni sul databaseLesecuzione delle interrogazioni su database viene effettivamente eseguita solo nei seguenti casi:Viene enumerato il risultato della queryViene applicato loperatore First o Any con LINQLa query , pertanto, eseguita solo quando i suoi risultati sono effettivamente necessari

varcustomers=entities.Customers.Where(c=>c.CustomerID=="ALFKI");

foreach(varcustomerincustomersWithOrders) { }Esecuzione queryOperazioni sul databaseDemo

Operazioni sul databaseCreateLoperazione di create, cio di inserimento di un nuovo record supportata semplicemente creando una nuova istanza della classe corrispondente ed aggiungendola allObjectContext con il metodo AddObject

DeleteAnalogamente alloperazione di inserimento, la cancellazione supportata richiamando semplicemente il metodo DeleteObject dellObjectContext

Customerscustomer=newCustomers();customer.CustomerID="KILOP";customer.CompanyName="Kilop";entities.Customers.AddObject(customer);entities.Customers.DeleteObject(customer);

Operazioni sul databaseUpdateNormalmente lObjectContext tiene traccia dello stato di tutti gli oggetti restituiti da una interrogazioneQuesta funzionalit gli consente di persistere su database le modifiche effettuate sulle propriet degli oggettiPersistenzaLe operazioni di Insert, Update e Delete vengono persistite solo alla chiamata del metodo SaveChanges dellObjectContextIl metodo SaveChanges viene sempre eseguito in transazioneSe unoperazione 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 databaseDemo

Gestione delle connessioniADO.NET Entity Framework apre e chiude le connessioni automaticamente per il tempo strettamente necessario allesecuzione di unoperazioneE 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 transazioniAnalogamente ad ADO.NET, Entity Framework supporta la gestione delle transazioni in due modalit:Gestendo manualmente la connessioneUtilizzando le classi del namespace System.Transactions (ad esempio TransactionScope)

Gestione delle transazioniGestione manuale delle connessioni

entities.Connection.Open();vartransaction=entities.Connection.BeginTransaction();try{Customerscustomer=newCustomers();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 transazioniUtilizzando System.Transactions

using(TransactionScopescope=newTransactionScope()){Customerscustomer=newCustomers();customer.CustomerID="KILOP";customer.CompanyName="Kilop";entities.Customers.AddObject(customer);

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

scope.Complete();}Gestione delle transazioniDemo

Lazy loadingUtilizzando ADO.NET Entity Framework il risultato di una interrogazione rappresentato da un oggetto o da una collezioneLe relazioni tra le tabelle del database nel modello ad oggetti sono rappresentate da navigation property, cio da propriet delle classi che referenziano altri oggettiEntity 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 property

varcustomers=entities.Customers.Where(c=>c.CustomerID=="ALFKI");varcustomerFound=customers.First();varorders=customerFound.Orders.ToList();Lazy loadingLazy loadingDemo

POCONormalmente Visual Studio a partire da un EDMX, genera una serie di classi che rappresentano le entit del modello concettualeQueste classe ereditano da EntityObject e sono oggetti piuttosto complessi:Numerosi attributi, partial method, INotifyPropertyChanged, ecc.Utilizzare tali oggetti in tutta lapplicazione la rende fortemente dipendente dalla specifica tecnologia di accesso ai dati utilizzata e potrebbe non essere la soluzione ottimale quando si vogliono esporre servizi WCFVisual Studio 2010 e Entity Framework 4 introducono il supporto ai Plain Old CLR Object, cio alluso di classi semplici da utilizzare come modello concettualePer implementare i POCO si adopera lADO.NET Entity POCO Generator

POCODemo

RisorseMSDNhttp://msdn.microsoft.comADO.NET Team Bloghttp://blogs.msdn.com/b/adonet/LINQ to Entities Debug Visualizerhttp://www.rajavenkatesh.comADO.NET Entity Framework Wikipediahttp://en.wikipedia.org/wiki/ADO.NET_Entity_FrameworkDotNetSidehttp://dotnetside.orgIl mio bloghttp://www.vifani.com

Q & ADomande ?

Grazie per lattenzione