ADO.net - www3 - Università di Bologna

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