chiave di entità
Una chiave di entità è una proprietà o un set di proprietà di un tipo di entità usate per determinare l'identità. Le proprietà che costituiscono una chiave di entità vengono scelte in fase di progettazione. I valori delle proprietà della chiave di entità devono identificare in modo univoco in fase di esecuzione un'istanza del tipo di entità all'interno di un set di entità. Le proprietà che costituiscono una chiave di entità devono essere scelte per garantire univocità delle istanze in un set di entità.
Di seguito sono elencati i requisiti che consentono a un set di proprietà di essere una chiave di entità:
Non possono esistere due chiavi di entità identiche all'interno di un set di entità, vale a dire che, per due entità qualsiasi all'interno di un set di entità, i valori per tutte le proprietà che costituiscono una chiave non possono essere gli stessi. Tuttavia, alcuni valori (ma non tutti) che costituiscono una chiave di entità possono essere gli stessi.
Una chiave di entità deve essere costituita da un set di proprietà di tipo primitivo non nullable e immutabili.
Le proprietà che costituiscono una chiave di entità per un determinato tipo di entità non possono essere modificate. Non è possibile consentire più di una possibile chiave di entità per un determinato tipo di entità. Le chiavi surrogate non sono supportate.
Quando un'entità è coinvolta in una gerarchia di ereditarietà, l'entità radice deve contenere tutte le proprietà che costituiscono la chiave di entità e la chiave di entità deve essere definita sul tipo di entità radice. Per altre informazioni, vedere Entity Data Model: Ereditarietà.
Esempio
Nel diagramma seguente viene illustrato un modello concettuale con tre tipi di entità: Book
, Publisher
e Author
. Le proprietà di ogni tipo di entità che costituiscono la chiave di entità vengono indicate con "(Key)". Si noti che il tipo di entità Author
dispone di una chiave di entità costituita da due proprietà, Name
e Address
.
ADO.NET Entity Framework usa un linguaggio specifico di dominio (DSL) denominato Conceptual Schema Definition Language (CSDL) per definire i modelli concettuali. Il linguaggio CSDL seguente definisce il tipo di entità Book
illustrato nel diagramma precedente. Si noti che la chiave di entità viene definita facendo riferimento alla proprietà ISBN
del tipo di entità.
<EntityType Name="Book">
<Key>
<PropertyRef Name="ISBN" />
</Key>
<Property Type="String" Name="ISBN" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" />
<Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
<NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
FromRole="Book" ToRole="Publisher" />
<NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
FromRole="Book" ToRole="Author" />
</EntityType>
La proprietà ISBN
è una valida scelta per la chiave di entità perché un codice ISBN (International Standard Book Number) identifica in modo univoco un libro.
Il linguaggio CSDL seguente definisce il tipo di entità Author
illustrato nel diagramma precedente. Si noti che la chiave di entità è costituita da due proprietà, Name
e Address
.
<EntityType Name="Author">
<Key>
<PropertyRef Name="Name" />
<PropertyRef Name="Address" />
</Key>
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="String" Name="Address" Nullable="false" />
<NavigationProperty Name="Books" Relationship="BooksModel.WrittenBy"
FromRole="Author" ToRole="Book" />
</EntityType>
L'utilizzo di Name
e Address
per la chiave di entità è una scelta ragionevole, perché è improbabile che due autori con lo stesso nome vivano allo stesso indirizzo. Questa scelta per una chiave di entità non garantisce tuttavia in modo assoluto chiavi di entità univoche in un set di entità. In questo caso, è consigliabile aggiungere una proprietà, ad esempio AuthorId
, che consente di identificare in modo univoco un autore.