#94 - Mapping per l'ereditarietà tramite Table-per-Hierarchy con Entity Framework
di Marco De Sanctis, in LINQ, Entity Framework, 28 gennaio 2009
Uno dei vantaggi principali dell'utilizzo di oggetti per modellare i dati è costituito dalla possibilità di rappresentare concetti che non sono direttamente esprimibili nel mondo relazionale dei database. L'ereditarietà nel mondo Object Oriented è sicuramente uno di questi. Entity Framework supporta tre strategie differenti per gestire questo tipo di relazione, la più semplice delle quali è denominata Table-per-Hierarchy e consiste nell'utilizzare una sola tabella per rappresentare tutte le possibili classi che fanno parte di una determinata gerarchia. Supponiamo allora di avere un dominio di questo tipo:

L'idea è quella di avere, lato DataBase, un'unica tabella che contenga le colonne relative ad ognuna della classi definite, unitamente ad una colonna (nell'esempio chiamata "Tipo") che consenta di discriminare il tipo di oggetto associato ad ogni riga:

I diversi valori di Tipo corrispondenti agli oggetti Automobile, Furgone e Ciclomotore possono essere specificati direttamente nel designer del mapping mentre non è necessario specificare alcuna corrispondenza per le colonne della tabella relative ad oggetti di altri tipi.

Da un punto di vista del codice, nulla cambia rispetto all'utilizzo tradizionale, tenendo però conto che nonostante siano state definite quattro entity differenti, grazie alla relazione di ereditarietà queste appartengono tutte al medesimo EntitySet. Basta allora creare gli oggetti del tipo voluto e procedere al salvataggio:
using (MyContext context = new MyContext()) { Automobile automobile = new Automobile(); // ...valorizzazione dei dati... Ciclomotore ciclomotore = new Ciclomotore(); // ...valorizzazione dei dati... Furgone furgone = new Furgone(); // ...valorizzazione dei dati... context.AddToVeicoli(automobile); context.AddToVeicoli(ciclomotore); context.AddToVeicoli(furgone); context.SaveChanges(); }
In fase di INSERT, sarà Entity Framework ad impostare, coerentemente con il tipo di oggetto, il valore corrispondente per la colonna Tipo, a seconda di come specificato nel mapping, come si può verificare eseguendo il codice di esempio allegato allo script; allo stesso modo, anche in corrispondenza di un fetch, verrà costruito un oggetto del tipo specifico associato al valore di questa colonna.
Approfondimenti
-
Entity Framework 4.0 e le applicazioni preesistenti
-
#153 - Invocare servizi WCF da Javascript
-
#124 - Ottimizzare le Where con l'operatore Like in Entity Framework
-
Rilasciata la Feature CTP2 di #EntityFramework 4.0 con miglioramenti a CodeOnly e Self-Tracking Entities http://u.aspitalia.com/ce
-
.NET Framework 4.0 beta 1: Tuple
-
#127 - Ospitare i controlli Windows Forms in un'applicazione WPF
-
#105 - Serializzare le classi di Entity Framework
-
#160 - Forzare il caricamento dei metadati con Entity Framework
-
Entity Framework e le performance con la Like
-
#149 - Personalizzare le istanze di un servizio WCF
-
#122 - Ricercare nodi su più livelli in una struttura XML utilizzando LINQ to XML
-
#119 - Creare servizi WCF per applicazioni Silverlight

















Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.