實體索引鍵
「實體索引鍵」是屬性或實體類型的屬性集,用於判斷身分識別。 構成實體索引鍵的屬性是在設計階段選取的。 實體索引鍵屬性的值必須在執行階段的實體集中,單獨識別實體類型執行個體。 您應選取構成實體索引鍵的屬性,以保證執行個體在實體集中的唯一性。
屬性集若要成為實體索引鍵,需求如下:
實體集中的任兩個實體索引鍵均不可完全相同。 也就是說,以實體集中任兩個實體來說,構成索引鍵的所有屬性的值不可完全相同。 不過,構成實體索引鍵的部分 (非所有) 值可以相同。
實體索引鍵必須包含一組不可為 null 且不可變的簡單型別屬性。
構成指定實體類型之實體索引鍵的屬性不可變更。 您不能允許指定的實體類型擁有多個可能的實體索引鍵,不支援 Surrogate 索引鍵。
實體與繼承階層相關時,根實體必須包含構成實體索引鍵的所有屬性,而且必須在根實體類型定義該實體索引鍵。 如需詳細資訊,請參閱實體資料模型:繼承。
範例
下圖顯示包含三種實體類型 (Book
、Publisher
和 Author
) 的概念模型。 構成實體索引鍵之每個實體類型的屬性皆加註「(索引鍵)」。 請注意,Author
實體類型的實體索引鍵包含兩個屬性:Name
和 Address
。
ADO.NET Entity Framework 會使用稱為概念結構定義語言 (CSDL) 的特定領域語言 (DSL) 來定義概念模型。 下列的 CSDL 會定義上圖顯示的 Book
實體類型。 請注意,實體索引鍵是藉由參考實體類型的 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
屬性是實體索引鍵的最佳選擇,因為國際標準書號 (International Standard Book Number,ISBN) 可明確識別一本書。
下列的 CSDL 會定義上圖顯示的 Author
實體類型。 請注意,實體索引鍵包含兩個屬性: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
,可用於明確識別作者。