Con l'arrivo di LINQ (Language-INtegrated Query) nel .NET Framework 3.5 e delle tecnologie figlie (LINQ to DataSet e LINQ to SQL), è stato importante aggiungere a Visual Studio un nuovo designer in grado di assistere lo sviluppatore nella gestione di oggetti e relazioni Linq to SQL.
La tecnologia Linq to SQL è un OR/M (Object Relational Mapper) che fornisce un'infrastruttura per manipolare dati relazionali (prelevati da un database SQL Server) come se fossero degli oggetti e permetterci poi di eseguire query CRUD sui dati attraverso LINQ, senza quindi alcuna interazione diretta con la base di dati.
Nota: Attualmente il designer Object-Relational supporta solamente SQL Server.
Il nuovo designer permette di definire in maniera visuale le entità Linq to SQL, dell'applicazione. Al suo interno, possono essere infatti rappresentate, senza scivere codice:
- singole tabelle
- relazioni tra tabelle
- stored procedures
- funzioni
- vincoli di ereditarietà tra classi
Il designer si occupa inoltre di salvare il mapping tra le classi e gli oggetti del database, in un file con estensione .dbml
e di generare un oggetto, figlio della classe DataContext
, tipizzato.
Questo oggetto ha il compito di gestire tutti i tipi di eventi che vengono scatenati da dalle operazioni effettuate sugli elementi mappati e di gestire le comunicazioni tra le entità definite e la base di dati correlata. Tale oggetto potrà essere utilizzato sia all'interno di controlli di tipo DataSource che da codice attraverso query scritte tramite la sintassi LINQ.
Come abbiamo detto quindi, le tabelle della base di dati vengono trasformate dal designer in classi con definite una proprietà per ogni colonna presente nello schema della tabella, mentre le funzioni e le stored procedures, diventano metodi della classe tipizzata figlia di DataContext
.
Se ad esempio creiamo il file ORM.dbml, verrà creata dal designer la relativa classe ORMDataContext
, figlia diretta appunto della classe DataContext
.
Il designer Object-Relational si presenta agli sviluppatori diviso in due parti: la zona di sinistra, pensata per contenere le entità logiche definite correlate di proprietà, relazioni e vincoli di ereditarietà, la zona di destra, adibita invece per ospitare tutti i metodi che sono stati mappati a stored procedures o a funzioni presenti nella base di dati.
Una volta creato il mapping a formare il modello ad oggetti dell'accesso ai dati, possiamo visualizzare il codice .NET che il designer ha generato, per gestire le varie entità all'interno dell'applicazione attraverso classi specifiche e metodi di inserimento, aggiornamento o eliminazione.
È possibile, inoltre, aggiungere funzionalità custom: possiamo modificare il codice generato dal designer O-R, poiché per ogni entità viene generata una classe partial
, con proprietà e metodi pre-definiti; il meccanismo delle classi parziali ci permette quindi eventuali aggiunte o modifiche.
Una volta compilati, possiamo usare gli oggetti entità generati, all'interno di query basate su LINQ, il nuovo linguaggio di selezione di dati integrato nel .NET Framework. Attraverso esso infatti, potremo eseguire ogni tipo di selezione, inserimento, modifica o cancellazione, senza scrivere una sola riga di codice SQL.
È importante notare che, al contrario di quanto accade con il DataSet Designer e i file .xsd, questo designer assieme alla tecnologia Linq To SQL, permette un mapping diretto degli oggetti presenti all'interno della base di dati con delle classi .NET.