Entity Framework中的DefiningQuery元素
DefiningQuery 是一个非常有用的元素,您可以在 Entity Framework 中使用它,以便从模型中创建数据库视图。 本文将解释 DefiningQuery 元素。
引言
有时我们需要在 Entity Framework 中做一些其设计器不支持的事情。 其中之一是使用 DefininqQuery
元素,该元素在模型中创建一个视图,可用于投影自定义实体。 为了理解本文,您应该熟悉 Entity Data Model XML 架构类型。 如果您不熟悉 EDM,您可以访问以下链接。
DefiningQuery 元素
DefiningQuery
元素在存储架构定义语言 (SSDL) 中定义。
当您在 EDM 向导中映射数据库视图时,会自动创建这些元素。
这些元素是数据的只读投影,因此与数据库视图一样是只读的。
到目前为止,您可能想知道我为什么要写它们。
关于 DefiningQuery
元素的优点是它们可以帮助您创建您想要的每个投影。 在创建元素之后,您可以使用 EDM 设计器创建实体来处理创建的视图。
那么,什么元素如此出色,它为我们提供了只读数据?
通过将存储过程连接到概念架构定义语言 (CSDL) 上创建的实体,您可以向定义的查询添加写入功能。
这种方法的缺点是您需要使用 XML 编辑器手动更新 SSDL。 此外,在编写查询时您没有智能感知,因此我建议您先在数据库管理工作室中尝试一下,然后再将其移至 SSDL。
在 SSDL 中定义查询或手动编辑模型时,您应该非常小心!
DefiningQuery 元素示例
在下一个示例中,我将继续使用数据库和我之前的文章中的示例。 数据库模式显示在下一张图中

设计器的当前状态显示在下一张图中

如何定义 DefiningQuery
元素?
首先,为数据投影编写查询。
我将使用的查询将从两个表 - Employees
和 Companies
中 select
详细信息。
SELECT e.EmpolyeeID AS EmpolyeeID,
e.EmployeeFirstName AS EmployeeFirstName,
e.EmployeeLastName AS EmployeeLastName,
c.CompanyName AS CompanyName
FROM Employees AS e INNER JOIN Companies AS c ON (e.CompanyID = c.CompanyID)
使用 XML 编辑器打开 edmx 文件,并查找 SSDL 区域。 将一个新的 EntitySet
插入到 SSDL 中,其中包含 DefiningQuery
元素。 在示例中,我插入了一个名为 EmployeeWithCompany
的新实体集
<EntitySet Name="EmployeeWithCompany"
EntityType="TestLINQModel.Store.EmployeeWithCompany">
<DefiningQuery>
SELECT e.EmpolyeeID as EmpolyeeID,
e.EmployeeFirstName AS EmployeeFirstName,
e.EmployeeLastName AS EmployeeLastName,
c.CompanyName AS CompanyName
FROM Employees AS e INNER JOIN Companies AS c ON (e.CompanyID = c.CompanyID)
</DefiningQuery>
</EntitySet>
插入新的 EntitySet
后,您需要提供一个新的实体类型,在我的示例中称为 EmployeeWithCompany
。 您可以看到实体集引用了此类型。
实体类型应如下所示
<EntityType Name="EmployeeWithCompany">
<Key>
<PropertyRef Name="EmpolyeeID"/>
</Key>
<Property Name="EmpolyeeID" Type="int"
Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="CompanyName" Type="nvarchar" MaxLength="100" />
<Property Name="EmployeeFirstName" Type="nvarchar" MaxLength="50" />
<Property Name="EmployeeLastName" Type="nvarchar" MaxLength="50" />
</EntityType>
请注意要准确定义属性元素,就像它们在数据库中的定义一样(类型和约束)。 这是手动完成的,因此您可能会出错。
在这些操作之后,数据投影已准备好在 CSDL 中使用。 打开设计器并创建一个名为 EmployeeWithCompany
的新实体。 为该实体添加四个属性,以匹配在 SSDL 中定义的实体类型的属性。 您的设计器界面应如下所示

创建实体后,我们需要将其连接到创建的视图及其属性。 您可以通过在映射视图的“表”列中选择视图名称,并将相关的实体集属性映射到实体属性来完成此操作。 结果如下

构建解决方案,您就可以使用新的只读实体了。
摘要
DefiningQuery
元素是自定义您的 Entity Framework 模型的一种非常有用的强大方法。 为了使用它,您需要手动创建一个包含 DefiningQuery
的实体集和一个用于返回类型的实体类型。 在本文中,我展示了一个简单的例子来说明如何做,并创建了一个只读实体。 为了使其成为可写实体,您将需要为 Create
/Update
/Delete
操作创建一个存储过程。
历史
- 2010 年 7 月 27 日:初始帖子