实体键

实体键是用于确定标识的实体类型的属性或一组属性。 在设计时选择构成实体键的属性。 在运行时,实体键属性的值必须唯一标识实体集中某个实体类型实例。 应选择构成实体键的属性,以确保实体集中实例的唯一性。

下面是将一组属性用作实体键的要求:

  • 在一个实体集中,没有两个实体键是相同的。 也就是说,对于实体集中的任何两个实体,构成键的所有属性的值都不能相同。 但是,构成实体键的一些值(但并非全部)可以相同。

  • 实体键必须包含一组不可为 null 的、不可变的 基元类型属性

  • 构成给定实体类型的实体键的属性无法更改。 不能允许给定实体类型的多个可能的实体键;不支持代理键。

  • 在继承层次结构中涉及实体时,根实体必须包含构成实体键的所有属性,并且必须在根实体类型上定义实体键。 有关详细信息,请参阅 实体数据模型:继承

示例:

下图显示了一个概念模型,其中包含三种实体类型:BookPublisherAuthor。 构成实体键的每个实体类型的属性都用“(Key)”表示。 请注意,实体 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 属性是实体键的一个不错的选择,因为国际标准书号(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>

使用NameAddress作为实体键是一个合理的选择,因为同名的两个作者不太可能位于同一地址。 但是,针对实体键的这种选择并不能绝对确保实体键在实体集中的唯一性。 在这种情况下,建议添加可用于唯一标识作者的属性,例如 AuthorId

另请参阅