实体键(实体数据模型)
**“实体键”是用于确定标识的实体类型的一个或一组属性。 构成实体键的属性是在设计时选择的。 实体键属性的值必须在运行时唯一标识实体集中的实体类型实例。 在选择构成实体键的属性时应确保实例在实体集中的唯一性。
下面是将一组属性用作实体键的要求:
实体集中不能存在两个相同的实体键。 也就是说,对于实体集中的任意两个实体,构成一个键的所有属性的值不能全部相同。 但是,构成实体键的部分(而不是全部)值可以相同。
实体键必须由一组不可为 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。
使用 Name 和 Address 作为实体键是一个合理的选择,因为两个同名的作者不太可能住在相同的地址。 但是,实体键的这种选择并不能绝对确保实体键在实体集中的唯一性。 在这种情况下,建议添加一个可用来唯一标识作者的属性,例如 AuthorId。