实体键
“实体键”是用于确定标识的实体类型的一个或一组属性。 构成实体键的属性是在设计时选择的。 实体键属性的值必须在运行时唯一标识实体集中的实体类型实例。 在选择构成实体键的属性时应确保实例在实体集中的唯一性。
下面是将一组属性用作实体键的要求:
实体集中不能存在两个相同的实体键。 也就是说,对于实体集中的任意两个实体,构成一个键的所有属性的值不能全部相同。 但是,构成实体键的部分(而不是全部)值可以相同。
实体键必须由一组不可为 null 且不可变的基元类型属性组成。
构成给定实体类型的实体键的属性不可更改。 对于某个给定实体类型,不能允许存在多个可能的实体键;不支持代理键。
当实体位于继承层次结构中时,根实体必须包含构成实体键的所有属性,并且必须在根实体类型上定义实体键。 有关详细信息,请参阅实体数据模型:继承。
示例
下图显示了一个具有三个实体类型的概念模型:Book
、Publisher
和 Author
。 构成其实体键的每个实体类型的属性均用“(Key)”标示出来。 请注意,Author
实体类型有一个包含两个属性(Name
和 Address
)的实体键。
ADO.NET 实体框架使用一种称为“概念架构定义语言 (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
属性是一个不错的选择,因为国际标准书号 (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
。