如何:添加定义查询(实体框架)

本主题介绍如何向 .edmx 文件添加定义查询和相应的概念实体类型。 使用定义查询可以执行在 .edmx 文件的 DefiningQuery 元素中指定的 SQL 语句。 有关更多信息,请参见 DefiningQuery Element (EntitiContainer SSDL)。 定义查询通常用于提供类似于数据库视图(但该视图是在 .edmx 文件中定义的,而不是在数据库中定义)所提供的功能。 概念实体类型用于显示由概念层中的定义查询公开的数据。

Cc982038.note(zh-cn,VS.100).gif注意:
运行模型更新向导时,将覆盖对存储模型所做的所有更改(包括定义查询)。

无法将参数化查询作为定义查询执行。 默认情况下,使用定义查询显示的数据为只读数据。 但是,可以通过将显示数据的实体类型的插入、更新和删除函数映射到存储过程来更新数据。 有关更多信息,请参见如何:将修改函数映射到存储过程(实体数据模型工具)演练:将一个实体映射到存储过程(实体数据模型工具)

下面的过程高度概括向 .edmx 文件添加定义查询和概念实体类型的信息。 后面的示例提供了有关这些过程中各个步骤的更多详细信息。

这些过程假定在 Visual Studio 中已打开有效的 .edmx 文件。

添加定义查询

添加定义查询

  1. 向 .edmx 文件的 SSDL 部分添加 EntitySet 元素。 仅指定 EntitySet 元素的 NameEntityType 属性。 有关更多信息,请参见 EntitySet Element (EntityContainer SSDL)

  2. 向新添加的 EntitySet 元素添加一个 DefiningQuery 元素。 指定要在 DefiningQuery 元素的正文中执行的 SQL 语句。 有关更多信息,请参见 DefiningQuery Element (EntitiContainer SSDL)

  3. 向 .edmx 文件的 SSDL 部分添加 EntityType 元素。 此 EntityType 元素必须描述 DefiningQuery 元素中的 SQL 语句返回的列。 有关更多信息,请参见 EntityType Element (SSDL)

向概念模型添加实体类型

添加概念实体类型

  1. 向 .edmx 文件的 CSDL 部分添加 EntitySet 元素。 有关更多信息,请参见 EntitySet Element (EntityContainer CSDL)

  2. 向 .edmx 文件的 CSDL 部分添加 EntityType 元素。 Name 属性应与上一步中 EntitySet 元素的 Name 属性具有相同的值。 实体类型的属性应映射到上述过程的 DefiningQuery 元素中指定的 SQL 语句返回的数据。 有关更多信息,请参见 EntityType Element (CSDL)

映射概念实体类型和存储实体类型

映射概念实体类型和存储实体类型

  1. 向 .edmx 文件的映射部分添加一个 EntitySetMapping 元素,该元素在前面两个过程中映射概念实体和存储实体。 有关更多信息,请参见 EntitySetMapping Element (MSL)Mapping a Conceptual Model to a Storage Schema

示例

下面的示例向 School.edmx 文件添加一个定义查询,以便使用 GradeReport 实体类型显示有关学生成绩的信息。 按照实体框架Quickstart生成 School 实体数据模型主题中的步骤可以生成 School.edmx 文件。

若要添加定义查询,必须首先向 .edmx 文件的 SSDL 部分添加 EntitySet 元素(其中包含 DefiningQuery 元素)。 注意下列事项:

  • 仅指定了 EntitySet 元素的 NameEntityType 属性。

  • EntityType 属性中使用了实体类型的完全限定名。

  • DefiningQuery 元素中指定了要执行的 SQL 语句。

<EntitySet Name="GradeReport"
 EntityType="SchoolModel.Store.GradeReport" >
  <DefiningQuery>
    SELECT CourseID, Grade, FirstName, LastName
    FROM StudentGrade
    JOIN
    (SELECT * FROM Person WHERE EnrollmentDate IS NOT NULL) AS p
    ON StudentID = p.PersonID
  </DefiningQuery>
</EntitySet>

然后,向 .edmx 文件的 SSDL 部分添加下列 EntityType 元素。 。 注意下列事项:

  • Name 属性的值对应于上述 EntitySet 元素中的 EntityType 属性的值,尽管在 EntityType 属性中使用了实体类型的完全限定名。

  • 属性名称对应于上述 DefiningQuery 元素中的 SQL 语句返回的列名称。

  • 在此示例中,实体键由三个属性组成以确保唯一键值。

<EntityType Name="GradeReport">
  <Key>
    <PropertyRef Name="CourseID" />
    <PropertyRef Name="FirstName" />
    <PropertyRef Name="LastName" />
  </Key>
  <Property Name="CourseID"
            Type="int"
            Nullable="false" />
  <Property Name="Grade"
            Type="decimal"
            Precision="3"
            Scale="2" />
  <Property Name="FirstName"
            Type="nvarchar"
            Nullable="false"
            MaxLength="50" />
  <Property Name="LastName"
            Type="nvarchar"
            Nullable="false"
            MaxLength="50" />
</EntityType>

若要向概念模型中添加实体类型,必须首先在 .edmx 文件的 CSDL 部分中添加下列 EntitySet 元素。 请注意,在 EntityType 属性中使用了实体类型的完全限定名。

<EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />

然后,向 .edmx 文件的 CSDL 部分添加下列 EntityType 元素。 注意下列事项:

  • Name 属性的值对应于上述 EntitySet 元素中的 EntityType 属性的值,尽管在 EntityType 属性中使用了实体类型的完全限定名。

  • 属性名称对应于上述 DefiningQuery 元素中的 SQL 语句返回的列名称。

  • 在此示例中,实体键由三个属性组成以确保唯一键值。

<EntityType Name="GradeReport">
  <Key>
    <PropertyRef Name="CourseID" />
    <PropertyRef Name="FirstName" />
    <PropertyRef Name="LastName" />
  </Key>
  <Property Name="CourseID"
            Type="Int32"
            Nullable="false" />
  <Property Name="Grade"
            Type="Decimal"
            Precision="3"
            Scale="2" />
  <Property Name="FirstName"
            Type="String"
            Nullable="false"
            MaxLength="50"
            Unicode="true"
            FixedLength="false" />
  <Property Name="LastName"
            Type="String"
            Nullable="false"
            MaxLength="50"
            Unicode="true"
            FixedLength="false" />
</EntityType>

若要映射概念实体类型和存储实体类型,需要在 .edmx 文件的映射部分添加下列 EntitySetMapping 元素。

<EntitySetMapping Name="GradeReport">
  <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.GradeReport)">
    <MappingFragment StoreEntitySet="GradeReport">
      <ScalarProperty Name="CourseID" ColumnName="CourseID" />
      <ScalarProperty Name="Grade" ColumnName="Grade" />
      <ScalarProperty Name="FirstName" ColumnName="FirstName" />
      <ScalarProperty Name="LastName" ColumnName="LastName" />
    </MappingFragment>
  </EntityTypeMapping>
</EntitySetMapping>

GradeReport 实体类型现在已添加到 School 模型。 请注意,通过 GradeReport 实体类型显示的数据是只读的。

另请参见

概念

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

其他资源

手动编辑 .edmx 文件(实体框架)