如何:添加定义查询(实体框架)
本主题介绍如何向 .edmx 文件添加定义查询和相应的概念实体类型。 使用定义查询可以执行在 .edmx 文件的 DefiningQuery 元素中指定的 SQL 语句。 有关更多信息,请参见 DefiningQuery Element (EntitiContainer SSDL)。 定义查询通常用于提供类似于数据库视图(但该视图是在 .edmx 文件中定义的,而不是在数据库中定义)所提供的功能。 概念实体类型用于显示由概念层中的定义查询公开的数据。
注意: |
---|
运行模型更新向导时,将覆盖对存储模型所做的所有更改(包括定义查询)。 |
无法将参数化查询作为定义查询执行。 默认情况下,使用定义查询显示的数据为只读数据。 但是,可以通过将显示数据的实体类型的插入、更新和删除函数映射到存储过程来更新数据。 有关更多信息,请参见如何:将修改函数映射到存储过程(实体数据模型工具)和演练:将一个实体映射到存储过程(实体数据模型工具)。
下面的过程高度概括向 .edmx 文件添加定义查询和概念实体类型的信息。 后面的示例提供了有关这些过程中各个步骤的更多详细信息。
这些过程假定在 Visual Studio 中已打开有效的 .edmx 文件。
添加定义查询
添加定义查询
向 .edmx 文件的 SSDL 部分添加 EntitySet 元素。 仅指定 EntitySet 元素的 Name 和 EntityType 属性。 有关更多信息,请参见 EntitySet Element (EntityContainer SSDL)。
向新添加的 EntitySet 元素添加一个 DefiningQuery 元素。 指定要在 DefiningQuery 元素的正文中执行的 SQL 语句。 有关更多信息,请参见 DefiningQuery Element (EntitiContainer SSDL)。
向 .edmx 文件的 SSDL 部分添加 EntityType 元素。 此 EntityType 元素必须描述 DefiningQuery 元素中的 SQL 语句返回的列。 有关更多信息,请参见 EntityType Element (SSDL)。
向概念模型添加实体类型
添加概念实体类型
向 .edmx 文件的 CSDL 部分添加 EntitySet 元素。 有关更多信息,请参见 EntitySet Element (EntityContainer CSDL)。
向 .edmx 文件的 CSDL 部分添加 EntityType 元素。 Name 属性应与上一步中 EntitySet 元素的 Name 属性具有相同的值。 实体类型的属性应映射到上述过程的 DefiningQuery 元素中指定的 SQL 语句返回的数据。 有关更多信息,请参见 EntityType Element (CSDL)。
映射概念实体类型和存储实体类型
映射概念实体类型和存储实体类型
- 向 .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 元素的 Name 和 EntityType 属性。
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 实体类型显示的数据是只读的。