如何:在未推断任何键时创建实体键(实体框架)

本主题介绍在实体数据模型向导模型更新向导无法推断实体键时如何手动编辑 .edmx 文件以更改实体键。

使用实体数据模型向导或模型更新向导生成或更新 .edmx 文件时,实体类型的键会映射到对应表的主键。 如果未定义任何主键(例如,在视图中),则这些工具将尝试基于表列或视图列推断唯一实体键。 推断的键将由表或视图所有不可以为 null 和非二进制的列组成。 如果表或视图仅包含可以为 null 和二进制的列,将不会推断任何键。

如果未推断任何实体键,实体将不会添加到模型。 但包含 EntityType 元素(没有定义的键)的代码注释将添加到 .edmx 文件的 SSDL 部分。

有关实体键的更多信息,请参见 EntityType Element (CSDL)EntityType Element (SSDL)

本主题中的过程假定您已在 Visual Studio 中打开一个有效的 .edmx 文件。

Dd163156.note(zh-cn,VS.100).gif注意:
如果您使用模型更新向导更新模型,将覆盖按照下面过程的建议对 .edmx 文件的 SSDL 部分所做的更改。为了避免在这种情况下手动编辑 .edmx 文件,请修改数据库架构,以便每个表都具有主键,或者每个表或视图的一个或多个列为不可以为 null 或非二进制的列。

在未从表中推断任何键时添加实体键

下面的过程适用于与表对应的实体类型。 此过程假定已在 XML 编辑器中打开 .edmx 文件。

如果实体设计器不能基于表列推断实体键,实体将不会添加到模型。 但包含 EntityType 元素(没有定义的键)的代码注释将添加到 .edmx 文件的 SSDL 部分。

在未从表中推断任何键时添加实体键

  1. 取消注释 .edmx 文件的 SSDL 部分中的 EntityType 元素。

  2. 通过将相应的 Key 元素添加到 EntityType 元素定义实体类型的键。 有关更多信息,请参见 EntityType Element (SSDL)

    Dd163156.note(zh-cn,VS.100).gif注意:
    用于定义实体键的列必须唯一地标识表中的行。

  3. 在 SSDL 部分中,添加一个 EntitySet 元素,该元素指定所添加的实体类型映射到的表。 有关更多信息,请参见 EntitySet Element (EntityContainer SSDL)

  4. 在 CSDL 部分中,添加一个 EntityType 元素,该元素与所添加的 SSDL 实体类型相对应。 有关更多信息,请参见 EntityType Element CSDL

  5. 在 C-S(概念到存储)映射部分中,添加一个 EntitySetMapping 元素,该元素指定所添加的 SSDL 和 CSDL 实体类型之间的映射。 有关更多信息,请参见 EntitySetMapping Element (MSL)

未从视图中推断任何键时添加实体键

下面的过程适用于与视图对应的实体类型。 此过程假定已在 XML 编辑器中打开 .edmx 文件。

如果实体设计器不能基于视图列推断实体键,实体将不会添加到模型。 但包含 EntityType 元素(没有定义的键)的代码注释将添加到 .edmx 文件的 SSDL 部分。

未从视图中推断任何键时添加实体键

  1. 取消注释 .edmx 文件的 SSDL 部分中的 EntityType 元素。

  2. 通过将相应的 Key 元素添加到 EntityType 元素定义实体类型的键。 有关更多信息,请参见 EntityType Element (SSDL)

    Dd163156.note(zh-cn,VS.100).gif注意:
    用于定义实体键的列必须唯一地标识视图中的行。

  3. 将定义查询添加到模型。 有关更多信息,请参见 如何:添加定义查询(实体框架)

另请参见

概念

.edmx 文件概述(实体框架)