实体键

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

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

  • 实体集中不能存在两个相同的实体键。 也就是说,对于实体集中的任意两个实体,构成一个键的所有属性的值不能全部相同。 但是,构成实体键的部分(而不是全部)值可以相同。

  • 实体键必须由一组不可为 null 且不可变的基元类型属性组成。

  • 构成给定实体类型的实体键的属性不可更改。 对于某个给定实体类型,不能允许存在多个可能的实体键;不支持代理键。

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

示例

下图显示了一个具有三个实体类型的概念模型:BookPublisherAuthor。 构成其实体键的每个实体类型的属性均用“(Key)”标示出来。 请注意,Author 实体类型有一个包含两个属性(NameAddress)的实体键。

Example model with three entity types

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 实体类型。 请注意,该实体键包含两个属性,NameAddress

<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

请参阅