Come abbiamo visto nelle lezioni precedenti, ASP.Net MVC utilizza per convenzione una particolare struttura delle cartelle dei progetti. Pertanto i file relativi al Model (come le classi LINQ To SQL) trovano posto nella cartella Models
.
Per le sue funzionalità automatiche legate a LINQ To SQL, Visual Studio fa uso di particolari file di mappatura con estensione .dbml
. In questi file vengono descritte le tabelle e le classi C# che vengono loro associate. Selezioniamo la cartella Model
e creiamo al suo interno un nuovo file LINQ To SQL chiamatoGallery.dbml
:
A questo punto, con il file appena creato aperto, è sufficiente trascinare la tabella del database nello spazio di lavoro per creare una nuova classe LINQ To SQL:
Nello spazio di lavoro appare una rappresentazione grafica della classe che contiene al suo interno i campi della tabella GalleryImages
:
Questa classe, chiamata GalleryImage
, è stata creata automaticamente da Visual Studio e rappresenta ogni immagine. Ogni volta che interrogheremo il database tramite LINQ To SQL non avremo a che fare con le righe della tabella GalleryImages
ma con una collezione fortemente tipizzata di oggetti GalleryImage
.
Visual Studio crea in automatico anche un'altra classe, nel nostro caso chiamata GalleryDataContext
, di tipo System.Data.Linq.DataContext
. Questa classe è il punto di accesso che LINQ To SQL ci fornisce per selezionare e modificare i record contenuti nel database o per crearne di nuovi.
All'interno delle classi di tipo DataContext
, Visual Studio genera una particolare proprietà per ogni tabella trascinata all'interno del file LINQ To SQL, che prende il nome dalla tabella a cui si riferisce. Ad esempio, nel nostro caso abbiamo trascinato nel file una sola tabella, GalleryImages
, per cui avremo accesso soltanto ai record di quest'ultima attraverso una proprietà chiamata appunto GalleryImages
. L'accesso ai dati è fortemente tipizzato in quanto i record sono memorizzati in oggetti di tipo GalleryImage
come detto poco fa.
Possiamo accedere ai dati utilizzando una sintassi simile a questa:
// Creo una nuova istanza di GalleryDataContext
GalleryDataContext context = new GalleryDataContext();
// Seleziono la prima immagine presente nel database
GalleryImage image = context.GalleryImages.First();
// Accedo all'id dell'immagine
int id = image.ImageId;
// Accedo alla descrizione dell'immagine
string desc = image.Description;
Una delle caratteristche più interessanti della classe GalleryDataContext
consiste nel fatto di essere dichiarata come partial
. Possiamo quindi aggiungere alla classe generata da Visual Studio alcuni metodi di supporto:
public partial class GalleryDataContext
{
// Restituisce tutte le immagini
public List<GalleryImage> GetImages()
{
return this.GalleryImages.ToList();
}
// Restituisce un'immagine in base all'id
public GalleryImage GetImageById(int id)
{
return this.GalleryImages.FirstOrDefault(img => img.Id == id);
}
}
Questi metodi ci aiutano nella gestione della galleria di immagini, definiti in un file esterno chiamato GalleryDataContext.cs
. A questo punto la cartella Models
del progetto contiene quindi due file distinti:
Vedremo come utilizzare la classe LINQ To SQL e le funzioni appena definite parlando dei Controller e delle Viste.