24/10/2014 ADO.NET e intro a Entity Framework Vittorio Maniezzo - Università di Bologna ADO.NET Prima ODBC (Open Database Connectivity) • Assicura interoperabilità con molti DBMS • API molto comuni • Usa SQL come linguaggio di accesso ai dati OLE DB • Ampio accesso a dati, relazionali e altro • Interfaccia di basso livello (C++), sviluppato come COM • Non limitato a SQL per leggere dati • Può usare driver ODBC ADO (ActiveX Data Objects) • Interfaccia semplice component-based, object-oriented • Fornisce una modalità di programmazione alle OLE DB utilizzabile al di fuori del C++ 1 24/10/2014 ADO.NET Prima Applicazione utente ADO OLE DB ODBC OLE DB Provider OLE DB Provider Text File Mainframe Database Simple Provider Native Provider ODBC Driver Database ODBC Provider ADO.NET Prima ADO è stato pensato come modello connesso, tightly coupled • Appropriato per architetture client/server Principalmente relazionale (non gerarchico come XML) Gli oggetti non sono ben strutturati • Molti modi di fare la stessa cosa • Troppe funzinalità in ogni oggetto Non era pensato per ambienti distribuiti, n-tier 4 2 24/10/2014 ADO.NET ADO.NET è una collezione di classi, interfacce, strutture, e tipi che gestisce l’accesso ai dati all’interno del .NET Framework • Queste collezioni sono organizzate in namespace: System.Data, System.Data.OleDb, System.Data.SqlClient, etc. ADO .NET è un’evoluzione di ADO. ADO.NET Obiettivi • Scalabile, grazie a un modello progettuale non connesso • supporto XML (sia gerarchico che relazionale) • Accesso a dati su HTTP • Mantiene il modello di programmazione di ADO 3 24/10/2014 ADO.NET Managed Providers Applicazione utente ADO.NET Managed Provider OLE DB Provider SQL Server Database SQL Managed Provider Database ADO Managed Provider Managed Provider Un data provider .net è un insieme di classi che servono a connettersi a una sorgente dati per ottenerne e modificarne i dati. DataSet SQL Server .NET Data Provider SQL Server OLE DB .NET Data Provider OLEDB source 4 24/10/2014 Oggetti di un data provider Oggetto Descrizione Connection Stabilisce una connessione con una specifica sorgente dati. Command Esegue un comando sulla sorgent dati. Espone dei Parameters e accetta Transaction da una Connection. DataReader Legge uno stream di dati forward-only, read-only da una sorgente dati. DataAdapter Riempie un DataSet e gestisce gli aggiornamenti con la sorgente dati. ADO.NET Accesso ai dati Connesso: Forward-only, read-only • L’applicazione invia query, poi legge i risultati e li elabora • Oggetto DataReader Disconnesso • L’applicazione invia query, poi memorizza i risultati per una successiva elaborazione • Minimizza il tempo di connessione col database • Oggetto DataSet 5 24/10/2014 Architettura Strutture dati personali DataSet DataReader Managed Data Provider Command Command Connection Data Store Connection DBMS Architettura 6 24/10/2014 Classi ADO.NET Namespace System.Data Contiene le classi di base di ADO.NET Fondamentale è DataSet (disconnesso) Supporta tutti i tipi di applicazioni • Internet ASP.NET XML • Windows forms Contiene classi usate o derivate da managed providers IDbConnection, IDbCommand, IDbDataReader Classi ADO.NET Namespace System.Data.OleDb Managed provider in aggiunta ai provider OLEDB • • • • SQLOLEDB (SQL Server) – usa System.Data.SQL MSDAORA (Oracle) JOLT (Jet) OLEDB for ODBC providers Classi OleDbConnection, OleDbCommand e OleDbDataReader Classi per la gestione delle connessioni Classi per la gestione degli errori 7 24/10/2014 Classi ADO.NET Namespace System.Data.SqlClient Managed provider nativo per SQL Server Classi SqlConnection, SqlCommand e SqlDataReader Classi per • Error handling • Connection pooling System.Data.SqlTypes contiene le classi per i tipi di dati SQL Server nativi Classi ADO.NET Interfaccia IDbConnection Crea una sessione unica con una sorgente dati Implementata da SqlDbConnection e OleDbConnection Funzionalità • Open, close di connessioni • Inizio di transazioni IDbTransaction fornisce metodi Commit e Rollback Usata assieme agli oggetti IDbCommand e IDataAdapter 8 24/10/2014 Classi ADO.NET Interfaccia IDbCommand Rappresenta una istruzione da inviare alla sorgente dati di solito, ma non necessariamente, SQL Implementata da OleDbCommand e SqlCommand Funzionalità • Definisce l’istruzione da eseguire • Esegue l’istruzione • Passa e riceve parametri ExecuteReader ritorna le righe, ExecuteNonQuery non ritorna niente, ExecuteScalar ritorna un singolo valore Classi ADO.NET Interfaccia IDataReader Accesso forward-only, read-only a stream di dati Implementata da SqlDataReader e OleDbDataReader Creata col metodo ExecuteReader di IDbCommand Le operazioni sull’oggetto associato IDbConnection sono bloccate finchè il reader non viene chiuso 9 24/10/2014 ADO.NET, utilizzo connesso OleDbDataReader OleDbCommand OleDbConnection DBMS In un contesto connesso, le risorse sono mantenute sul server finchè non viene chusa la connessione Operazioni 1. Apri la connessione 2. Esegui un comando 3. Elabora le righe nel reader 4. Chiudi il reader 5. Chiudi la connessione Classi ADO.NET Esempio DataReader (SQLserver) string sConnString = “Provider=SQLOLEDB.1;” + “User ID=sa;Initial Catalog=Northwind;” + “Data Source=MYSERVER”; OleDbConnection conn = new OleDbConnection(sConnString); conn.Open(); string sQueryString = “SELECT CompanyName FROM Customers”; OleDbCommand myCommand = new OleDbCommand(sQueryString, conn); OleDbDataReader myReader = myCommand.ExecuteReader(); while (myReader.Read()) { Console.WriteLine(myReader.GetString(0)); } myReader.Close(); conn.Close(); 10 24/10/2014 Stringhe connessione (v. http://www.connectionstrings.com/) Postgres Server=127.0.0.1;Port=5432;Database=myDataBase;User Id=myUsername;Password=myPassword; Esempio string MyConString = "Server=localhost;UID=studenti; PWD=laPWD;Database=studenti;Port=5432;"; SqLite (NuGet: Install-Package System.Data.SQLite) Data Source=filename;Version=3; Esempio connString = @"Data Source="+dbpath+"; Version=3"; Access Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydatabase.mdb;User Id=admin;Password=; Esempio connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+mdbPath+";"; Classi ADO.NET DataSet • E’ una collezione di tabelle • Non conosce la sorgente dei dati • Gestisce le relazioni fra le tabelle • Potente interfaccia di programmazione (ha oggetti per tabelle, colonne, relazioni, ecc) • Ricorda lo stato originale e corrente dei dati • Può modificare dati e metadati • Il formato di serializzazione nativo è XML 11 24/10/2014 Classi ADO.NET DataSet DataSet DataTable DataColumn DataRow DataRelation Classi ADO.NET Interfaccia IDataAdapter • Riempie o aggiorna un DataSet • Implementata da OleDbDataAdapter e SqlDataAdapter • Non connection-based • Contiene 4 oggetti predefiniti per operazioni sul dataset: Select, Insert, Update e Delete 12 24/10/2014 ADO.NET utilizzo disconnesso DataSet OleDbDataAdapter OleDbConnection DBMS In un contesto disconnesso, le risorse NON sono gestite sul server quado i dati vengono elaborati Operazioni • Apri la connessioni • Riempi il DataSet • Chiudi la connessione • Elabora il DataSet • Apri la connessione • Aggiorna la sorgente dati • Chiudi la connessione Classi ADO.NET Esempio DataSet (Sqlserver) string sConnString = “Persist Security Info=False;” + “User ID=sa;Initial Catalog=Northwind;” + “Data Source=MYSERVER”; SqlConnection conn = new SqlConnection(sConnString); conn.Open(); string sQueryString = “SELECT CompanyName FROM Customers”; SqlDataAdapter myDSAdapter = new SqlDataAdapter(); DataSet myDataSet = new DataSet(); myDSAdapter.SelectCommand = new SqlCommand(sQueryString, conn); myDSAdapter.Fill(myDataSet); conn.Close(); 13 24/10/2014 Classi ADO.NET DataTable Oggetto in memoria che rappresenta una tabella • Colonne • Righe Schema definito dalla collection Columns Integrità dati gestita dall’oggetto Constraint Eventi pubblici • Modifica/cancellazione righe • Modifica colonne Classi ADO.NET DataColumn Elemento fondamentale di un DataTable (contenuto nella collection Columns) Definisce quali tipi di dati possono entrare (per mezzo della proprietà DataType) Altre proprietà: AllowNull, Unique e ReadOnly Può contenere Constraints (una collection su DataTable) Può contenere Relations (collection su DataSet) 14 24/10/2014 Classi ADO.NET DataRow Rappresenta i dati in una DataTable (contenuto nella collection Rows) Conforme allo schema definito da DataColumns Proprietà per determinare lo stato di una riga (new, changed, deleted ecc.) Classi ADO.NET DataRelation Correla due DataTables via DataColumns I valori di DataType delle due DataColumns devono essere identici Le modifiche non corrispondenti alla relazione sono proibite 15 24/10/2014 DataSet DataRowCollection DataSet DataTableCollection DataTable DataRow DataColumnCollection DataColumn DataRelationCollection DataView DataRelation La classe DataSet Un DataSets consiste di una o più tabelle da: • Uno o più data adapter. • Creazione da programma. • XML. • Altri DataSets. Le tabelle contengono colonne, vincoli, e righe. • Il concetto di “riga corrente” non esiste. • Tutto è una collection! 16 24/10/2014 Membri classe DataSet Clear Clears the DataSet of any data by removing all rows in all tables. Clone Copies the structure of the DataSet, including all DataTable schemas, relations, and constraints. Does not copy any data. Copy Copies both the structure and data for this DataSet. Merge Merges this DataSet with a specified DataSet. Membri classe DataSet AcceptChanges Commits all the changes made to this DataSet since it was loaded or the last time AcceptChanges was called. RejectChanges Rolls back all the changes made to the DataSet since it was created, or since the last time DataSet.AcceptChanges was called. GetChanges Gets a copy of the DataSet containing all changes made to it since it was last loaded, or since AcceptChanges was called. HasChanges Gets a value indicating whether the DataSet has changes, including new, deleted, or modified rows. 17 24/10/2014 Membri classe DataSet GetXml Returns the XML representation of the data stored in the DataSet. GetXmlSchema Returns the XSD schema for the XML representation of the data stored in the DataSet. ReadXml Reads XML schema and data into the DataSet. ReadXmlSchema Reads an XML schema into the DataSet. WriteXml Writes XML data, and optionally the schema, from the DataSet. WriteXmlSchema Writes the DataSet structure as an XML schema. DataSet: creazione tabella DataSet ds = new DataSet("DynamicDS"); ds.Tables.Add(“Ordini"); ds.Tables["Ordini"].Columns.Add("OrderID", Type.GetType("System.Int32")); ds.Tables["Ordini"].Columns.Add("CustomerFirstName", Type.GetType("System.String")); ds.Tables["Ordini"].Columns.Add("Data", Type.GetType("System.DateTime")); ds.Tables.Add(“RigheOrdine”); 18 24/10/2014 DataSet: aggiunta dato DataRow newRow; newRow = ds.Tables["Ordini"].NewRow(); newRow["OrderID"] = 101; newRow["CustomerFirstName"] = “Giovanni"; newRow["CustomerLastName"] = "Ducci"; newRow["Date"] = new DateTime(2009, 5, 1); m_ds.Tables["Ordini"].Rows.Add(newRow); Lettura DataTable DataTable myTable = ds.Tables[“RigheOrdine"]; foreach (DataColumn c in myTable.Columns) { Console.Write(c.ColumnName + "\t"); } Console.WriteLine(""); foreach (DataRow r in myTable.Rows) { foreach (DataColumn c in myTable.Columns) { Console.Write(r[c] + "\t"); } Console.WriteLine(""); } 19 24/10/2014 Aggiunta di una colonna Colonna normale: ds.Tables["Ordini"].Columns.Add("OrderID", Type.GetType("System.Int32")); Colonna calcolata: workTable.Columns.Add("Totale", typeof(Double)); workTable.Columns.Add(“Tasse",typeof(Double),"Total*0.086); workTable.Columns.Add(“Totalone",typeof(Double),"Max(Total)"); Aggiunta di una colonna Colonna Autoincrementata: DataColumn workColumn = workTable.Columns.Add("CustomerID",typeof(Int32)); workColumn.AutoIncrement = true; workColumn.AutoIncrementSeed = 200; workColumn.AutoIncrementStep = 3; 20 24/10/2014 Primary Key workTable.PrimaryKey = new DataColumn[] {workTable.Columns["CustLName"], workTable.Columns["CustFName"]}; Oppure DataColumn[] myKey = new DataColumn[2]; myKey[0] = workTable.Columns["CustLName"]; myKey[1] = workTable.Columns["CustFName"]; workTable.PrimaryKey = myKey; 41 DataRelation e Constraint DataColumn parentCol = m_ds.Tables["Ordini"].Columns["OrderID"]; DataColumn childCol = m_ds.Tables[“RigheOrdine"].Columns["fk_OrderID"]; // Crea e aggiunge la relazione m_ds.Relations.Add(new DataRelation("Ordini_RigheOrdine", parentCol, //primary key childCol)); InsertOrderDetailRecord(103, "Item-200", 9, "140.77"); 21 24/10/2014 Vincolo Unique Il vincolo unique assicura che tutti i dati nella/e colonna/e specificata/e sono unici per riga. Una DataTable.PrimaryKey è unique. DataColumn[] myColumns = new DataColumn[2]; myColumns[0] = myTable.Columns["id"]; myColumns[1] = myTable.Columns["Name"]; UniqueConstraint myUC = new UniqueConstraint("idNameConstrnt", myColumns, false); myTable.Constraints.Add(myUC); Vincolo ForeignKey Un ForeignKeyConstraint impone regole su come vengono propagati gli update e i delete a tabelle correlate. ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint ("Order_OrderDetail", m_ds.Tables["Ordini"].Columns["OrderID"], m_ds.Tables[“RigheOrdine"].Columns["fk_OrderID"])); custOrderFK.DeleteRule = Rule.None; custDS.Tables[“RigheOrdine"].Constraints.Add(custOrderFK); Non si può cancellare un ordine che ha associato delle righe d’ordine. 22 24/10/2014 DataView • Una DataView permette di creare viste diverse sui dati memorizzati in una DataTable. • Con una DataView si possono visualizzare i dati di una tabella con ordinamenti diversi, o filtrarli in base ai loro valori. DataGrid e DataView string sQueryString = "SELECT * FROM test"; SQLiteDataAdapter myDSAdapter = new SQLiteDataAdapter(); DataSet myDataSet = new DataSet(); myDSAdapter.SelectCommand = new SQLiteCommand(sQueryString, conn); myDSAdapter.Fill(myDataSet); DataTable Cart = new DataTable(); Cart = myDataSet.Tables[0]; DataView CartView = new DataView(Cart); dg.DataSource = CartView;// per collegare a un dataGridView 23 24/10/2014 Entity Framework 2002 ADO .Net v1.0 2005 ADO .Net v2.0 • Object Oriented Datasets. • Disconnected Model. • Provider Abstraction. • • • • • • Provider Factories Metadata schema Asynchronous Command Execution Conflict Detection Batch Updates Multiple Active Result Sets (MARS) Entity Framework 2006 • nessuna variazione in ADO.net ADO .Net v3.0 2007 ADO .Net v3.5 • Paging Support • Synchronization APIs • Language integrated Query (LINQ) • LINQ to SQL 24 24/10/2014 Entity Framework 2008 ADO .Net v3.5 SP1 • Entity Data Model (EDM) • Object Services • LINQ to Entities • Entity SQL • Entity Client • ADO .Net Data Services Object Relational Mapping (ORM) 25 24/10/2014 Tecnologie ORM Object-Relational Mapping (ORM) è una tecnica di programmazione per associare e convertire automaticamente dei dati fra tabelle di database e classi/oggetti OO ORM crea una sorta di database a oggetti utilizzabile da codici a oggetti come C# o Java I framework ORM (object-relational persistence frameworks) automatizzano il processo ORM. 51 ORM Framework I framework ORM tipicamente forniscono le seguenti funzionalità: • Creazione di un object model dal database schema • Creazione di un database schema dall'object model • Query dei dati via object-oriented API • Manipolazione dati CRUD: create, retrieve, update, delete I framework ORM generano automaticamente query SQL per effettuare le operazioni richieste sui dati 26 24/10/2014 ORM Mapping – Esempio Esempio di mapping per un sottinsieme del database Northwind ORM Entities schema database (Classi C#) relazionale ORM Framework Vantaggi ORM • Produttività: si scrive meno codice • Si nascondono le differenze fra la rappresentazione relazionale e ad oggetti, la complessità è gestita dall'ORM • Semplificazione delle operazioni CRUD per relazioni complesse • Manutenzione più semplice 54 27 24/10/2014 Entity Framework e ADO.NET • Entity Framework (EF) è un framework ORM, parte di .NET • Fornisce una infrastruttura run-time per gestire dati in database SQL come oggetti .NET • Lo schema del database relazionale è associato a un modello a oggetti (object model) • Visual Studio contiene dei tool per generare le associazioni (Entity Framework SQL data mapping). • I data mapping consistono di classi C# e di XML • Vengono anche fornite API per la manipolazione dei dati 55 Entity Framework e ADO.NET Le API dell’Entity Framework • Permettono di accedere a dati memorizzati sui database server • Sono basate su ADO.NET e LINQ LINQ to Entities è l’implementazione di Microsoft, basata su LINQ, del framework ORM • Funziona sia con SQL Server e SQL Server Express • Funziona con MySQL, SQLite, Oracle, etc. • Può lavorare con tabelle e relazioni one-to-many e many-to-many 56 28 24/10/2014 LINQ to Entities LINQ: permette di accedere e gestire con sintassi uniforme diversi tipi di contenitori di dati: • • • • • • LINQ to Objects LINQ to XML LINQ to DataSets LINQ to SQL ecc. (LINQ to Twitter, LINQ to Flickr, …) LINQ to Entities Multiple Database Support per Entity Framework Entity Framework Providers • • • • • • • • MySQL Connector\net (MySQL) Devart (Oracle, MySQL, SQLite and PostgreSQL) IBM (DB2, Informix and U2 databases) Phoenix Software Solutions (SQLite) Npgsql (PostgreSQL) Sybase SQL Anywhere (SQL Anywhere 11) Firebird (Firebird) VistaDB (VistaDB 4.x) v. http://msdn.microsoft.com/en-us/data/dd363565.aspx 29 24/10/2014 Entity Client L’EntityClient Provider dell’Entity Framework è nel namespace System.Data.EntityClient Permette di astrarre tutti i DBMS Providers nella architettura Entity Framework Entity Framework e ADO.NET Permette di: • Generare classi dal modello • Aggiornare le classi se il modello cambia • Gestire le connessioni al database • Effettuare le query sul modello, non sul database • Tradurre le queries al modello a query al database • Gestire cambiamenti agli oggetti del modello • Gestire update al database 30 24/10/2014 Entity Framework: Architettura Entity Framework: Architettura Binding Mapping Modeling Browsing Domain Modeling Tools Code Gen Applications Entity Services Programming Layers Reporting Analysis Sync Search Linq to Entities Entity SQL Entity Client – EDM, Entity SQL Metadata Services Query and Update Pipelines Mapping Transactions Entity Framework Runtime Data Providers (ADO.NET) SqlClient SQL Server OtherClient Relational DBMS Nonrelational Web Service 31 24/10/2014 Modello Logico Object Model (O – Space) Linq Mappati via Attributi o IPOCO (Interface Plain Old CLR Object) Conceptual Model (C - Space) ADO. Net Provider es.EntityClient Mappati via EDMGen o tools Store Model (S-Space) ADO. Net Provider es. SqlClient Object model Consiste in metadati, contenuti in 3 file XML • .CSDL (Conceptual Schema Definition Language): mappa i tipi delle entità usate nel conceptual model • .SSDL (Store Schema Definition Language): lo schema del DB associato • .MSL (Mapping Schema Language): mappa il CSDL al SSDL Creati col designer o con EMDGen Devono essere disponibili a runtime: o lo si copia nella cartella bin, o li si definisce come embedded resource 32 24/10/2014 File XML Run Time Design Time Modello *.EDMX Entity Data Model Schema *.CSDL Mapping *.MSL Database Objects Schema *.SSDL Mapping gerarchie di eredità Tabella Tabella Gerarchia di classi Classe (tipo) Table-per-Hierarchy (TPH) Table-per-Type (TPT) 33 24/10/2014 Table-per-Hierarchy (TPH) Una tabella nel database contiene i dati di tutti i tipi di una gerarchia di eredità nel modello Table-per-Type (TPT) Più tabelle nel database gestiscono i dati di ogni tipo nella gerarchia di eredità. 34 24/10/2014 Query Diverse modalità Utilizzo dell’EntityClient Provider • Query del C-Space per mezzo di ADO.Net e Entity SQL Utilizzo dell’Object Model 1. ObjectQuery<T> e Entity SQL per creare gli oggetti Uso di ObjectContext per definire i container 2. container appena generati per generare gli oggetti 3. Linq to Entities ObjectContext È un gestore degli Object Services: incapsula il mapping e gestisce le CRUD Aggiorna lo stato tramite ObjectStateManager • Se read only conviene MergeOptions.NoTracking Le entità possono avere 5 stati 1. 2. 3. 4. 5. Added Deleted Modified Unchanged Detached Gli stati vengono persistiti su database chiamando SaveChanges(), che forza ObjectContext a definire i CRUD esaminando le Entity collection e lo stato 35
© Copyright 2025 ExpyDoc