Entity Data Model: ereditarietà
Entity Data Model (EDM) supporta l'ereditarietà per i tipi di entità. L'ereditarietà in EDM è analoga all'ereditarietà per le classi nei linguaggi di programmazione orientati a oggetti. Come con le classi nei linguaggi orientati a oggetti, in un modello concettuale è possibile definire un tipo di entità (un tipo derivato) che eredita da un altro tipo di entità (il tipo di base). Tuttavia, a differenza delle classi nella programmazione orientata a oggetti, in un modello concettuale il tipo derivato eredita sempre tutte le proprietà e le proprietà di navigazione del tipo di base. Non è possibile eseguire l'override delle proprietà ereditate in un tipo derivato.
In un modello concettuale è possibile compilare gerarchie di ereditarietà nelle quali un tipo derivato eredita da un altro tipo derivato. Il tipo all'inizio della gerarchia (il tipo nella gerarchia che non è un tipo derivato) viene detto tipo radice. In una gerarchia di ereditarietà, la chiave di entità deve essere definita sul tipo radice.
Non è possibile compilare gerarchie di ereditarietà nelle quali un tipo derivato eredita da più di un tipo. In un modello concettuale con un tipo di entità Book
, ad esempio, è possibile definire i tipi derivati FictionBook
e NonFictionBook
che ereditano ognuno da Book
. Non è quindi possibile, tuttavia, definire un tipo che eredita sia dal tipo FictionBook
che dal tipo NonFictionBook
.
Esempio
Nel diagramma seguente viene illustrato un modello concettuale con quattro tipi di entità: Book
, FictionBook
, Publisher
e Author
. Il tipo di entità FictionBook
è un tipo derivato, che eredita dal tipo di entità Book
. Il tipo FictionBook
eredita le proprietà ISBN (Key)
, Title
e Revision
e definisce una proprietà aggiuntiva chiamata Genre
.
ADO.NET Entity Framework usa un linguaggio specifico di dominio (DSL) denominato Conceptual Schema Definition Language (CSDL) per definire i modelli concettuali. Nel seguente linguaggio CSDL viene definito un tipo di entità, FictionBook
, che eredita dal tipo Book
(come nel diagramma precedente):
<EntityType Name="FictionBook" BaseType="BooksModel.Book" >
<Property Type="String" Name="Genre" Nullable="false" />
</EntityType>