實體索引鍵是用來判斷身分識別之實體類型的屬性或一組屬性。 組成實體索引鍵的屬性會在設計時間選擇。 實體金鑰屬性的值必須在實體 集合 中在執行時唯一識別實體類型實例。 應該選擇組成實體索引鍵的屬性,以確保實體集中實例的唯一性。
以下是一組屬性為實體鍵的需求條件:
實體集中不可能有兩個相同的實體鍵。 也就是說,對於實體集內的任何兩個實體,構成索引鍵的所有屬性的值都不能相同。 不過,構成實體索引鍵的一些值(但並非全部)可以相同。
實體索引鍵必須包含一組不可為 Null、不可變、基本 類型屬性。
組成指定實體類型之實體索引鍵的屬性無法變更。 您不能允許給定的實體類型有多個可能的實體鍵;不支援代理鍵。
當實體涉及繼承階層時,根實體必須包含構成實體索引鍵的所有屬性,而且必須在根實體類型上定義實體索引鍵。 如需詳細資訊,請參閱 實體數據模型:繼承。
範例
下圖顯示具有三種實體類型的概念模型: Book、 Publisher和 Author。 組成實體索引鍵的每個實體類型屬性都會以 “(Key)” 表示。 請注意, Author 實體類型具有由兩個屬性 Name 和 Address組成的實體索引鍵。
ADO.NET Entity Framework 會使用稱為概念架構定義語言 (CSDL) 的網域特定語言 (DSL) 來定義概念模型。 下方的 CSDL 定義了在上方圖示中顯示的實體類型。 請注意,實體索引鍵是藉由參考 ISBN 實體類型的 屬性來定義。
<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>
屬性 ISBN 是實體索引鍵的好選擇,因為國際標準書號 (ISBN) 可唯一識別書籍。
下方的 CSDL 定義了在上方圖示中顯示的實體類型。 請注意,實體索引鍵由兩個屬性組成,分別是 Name 和 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>
使用 Name 和 Address 作為實體索引鍵是合理的選擇,因為同名的兩位作者不太可能位於相同的位址。 不過,對於實體索引鍵來說,這個選擇並不絕對保證實體集中的唯一實體索引鍵。 在這裡情況下,建議新增可用來唯一識別作者的屬性,例如 AuthorId。