将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库
<
不要删除
此文本,因为它是在浏览器中运行时生成的“主要”标题列表的占位符>
本教程介绍如何使用 Entity Framework、语言集成查询 (LINQ),以及如何对 Oracle 数据库使用 Model-First 以生成数据定义语言 (DDL) 脚本。
大约 30 分钟
Microsoft Entity Framework 抽象关系、逻辑数据库模式,然后向 .NET 应用程序呈现一个概念模式。它为 .NET 开发人员提供对象关系映射。
LINQ 是一种 .NET 数据查询语言,可以查询多种数据源,其中包括通过 LINQ to Entities 查询的实体。
Model-First 使开发人员能够首先创建概念模型。然后由 Visual Studio 创建 Oracle DDL 脚本,从而根据概念模型生成关系数据库模型。
在本教程中,您将了解如何将 Oracle 数据库和这三种技术与 Microsoft Visual Studio 和 Oracle Data Provider for .NET (ODP.NET) 结合使用。首先,您将使用 Entity Data Model Wizard 从现有 Oracle Database 模式创建一个实体数据模型 (EDM)。然后,使用三种不同方法查询此 EDM:
1. LINQ 查询
2. 使用 lambda 表达式进行 LINQ 查询,然后调用一个存储过程对结果进行更新。
3. Entity SQL
接下来,您将调用一个通过函数导入功能添加到 EDM 中的存储过程。该存储过程将修改数据库数据并通过一个隐式结果集返回结果。要返回结果集,需要在 .NET 配置文件中提供结果集参数信息。这样,无需使用存储过程即可向数据库中插入数据或者删除数据库中的数据。
最后,将演示如何结合使用 Model-First 和 Oracle 数据库。在 Model-First 模式中,开发人员首先创建一个 Entity Framework 对象关系数据模型。通过该数据模型,开发人员以 DDL 脚本形式自动生成 Oracle 关系数据库模型。
开始本教程之前,您应该:
安装 Microsoft Visual Studio 2010 以及 .NET Framework 4 或更高版本。
安装 Oracle Database 10.2 或更高版本,或者安装 Oracle Database XE。
从 Tables 中选择
DEPARTMENTS
和
EMPLOYEES
,从 Stored Procedures 中选择
INCREASE_SALARY_BY_10
和
UPDATE_AND_RETURN_SALARY
,然后单击
Finish
。
注:
如果不显示这些存储过程,请确保在本 OBE 前面已将它们添加到 OBE 中 — HR 模式中 Procedures 节点下的 INCREASE_SALARY_BY_10 和 UPDATE_AND_RETURN_SALARY。
可以通过多种方式查询 EDM,然后通过 EDM 从数据库中检索数据。本部分将演示三种常见的 EDM 查询方法:LINQ、采用 lambda 表达式的 LINQ 以及 Entity SQL。
要对 Oracle 数据库执行 LINQ 查询,需要为 ODP.NET 和 Entity Framework 程序集添加一个引用。然后创建代码以执行 LINQ 查询,并将结果返回到控制台窗口。
在
Solution Explorer
窗口中,右键单击
References
并选择
Add Reference
。
键入下图中高亮显示的命名空间引用。或者,您也可以复制并粘贴该信息。从您的工作目录中打开包含
Programcs.txt
的文件夹。然后,复制包含命名空间引用的代码,并粘贴到
Program.cs
的顶部。
通过这些指令可以访问 ODP.NET、ADO.NET 和 Entity Framework 命名空间。
键入以下 .NET 代码。这些代码对刚创建的 EDM 执行一个 LINQ 查询。然后访问结果并输出到屏幕上。该 LINQ 查询检索所有 EMPLOYEE_ID 值小于 max_id 变量的员工信息。
也可以从
Programcs.txt
中复制 LINQ 查询代码并粘贴到
Program.cs
的 Main 语句后面。确保用一个右花括号来结束 USING 代码块。
单击
(启动调试)。
LINQ 查询可以包括 lambda 表达式。Lambdas 用作标准查询运算符方法的 LINQ 参数。
通过将 Oracle 存储过程映射到 EDM 中的更新、插入和删除操作,可以对实体执行这些操作。
在本部分中,您将对 EMPLOYEE 实体执行一个使用 lambda 表达式的 LINQ 查询,然后映射一个存储过程以对所有选出的行执行更新操作。您将使用之前导入到 EDM 中的一个存储过程。
键入下图中高亮显示的代码,或在
Programcs.txt
中复制以
LINQ using lambda expressions --
开头的代码块,然后粘贴到
Program.cs
中已有代码语句的后面。单击
(启动调试)
在应用程序中,您将注意到 result.SALARY 设置为 result.SALARY。实际上,Entity Framework 执行的存储过程将工资增加了 10。在下一部分中,您将对这些行执行查询,以证明工资的确增加了 10。
注:
在查看了第一个结果集之后,按 Enter 键继续。
键入下图中高亮显示的代码,或在
Programcs.txt
中复制以
Entity SQL --
开头的代码块,然后粘贴到
Program.cs
中已有代码语句的后面。单击
(启动调试),查看工资增加 10 的更新结果。
注:
查看输出之后,按两下 Enter 继续。
通过 Entity Framework,开放人员能够定义自己的 .NET 方法来执行数据库存储过程。具体做法是在概念模型中创建函数导入,并将其映射到存储过程。在本部分中,您将定义自己的方法并映射到 Oracle 存储过程,用以执行更新。该存储过程还将使用一个隐式结果集返回修改后的数据。开发人员在 .NET 配置文件中定义结果集元数据,以便 Entity Framework 正确检索数据。
本部分介绍如何在 Entity Framework 中以编程方式修改 Oracle 数据库数据。您将对 DEPARTMENTS 表执行插入和删除操作。
您将使用 Visual Studio 的函数导入工具将存储过程映射到用户定义的 .NET 方法。由于存储过程返回一个隐式结果集,因此在使用该工具之前,需要在 .NET 配置文件中定义结果集元数据。
在 Solution Explorer 窗口中,打开
App.Config
文件。
在
Add Function Import
窗口中,选择
Returns a Collection Of
部分中的
Complex
。存储过程所返回的结果集中仅包含两列,而不是完整定义的实体或标量值。
单击
Get Column Information
。将从 .NET 配置文件中检索列信息。
要调用 .NET 中的方法,需要使用默认的
UPDATE_AND_RETURN_SALARY
函数导入名称。
在
Solution Explorer
窗口中,打开
Program.cs
文件。将
Programcs.txt
中以
Update salary using a stored procedure function import
开头的代码段键入或复制到已有代码语句的后面,如下图所示。您会看到,现在实体上下文中已经定义了一个
UPDATE_AND_RETURN_SALARY
方法。该方法将调用映射的存储过程并返回隐式结果集。
单击
(启动调试)。
注:
查看结果集之后,按三下 Enter 继续。
将插入或删除新部门的代码键入或复制到
Program.cs
文件中。您可以从
Programcs.txt
文件复制代码,然后将其粘贴到
Program.cs
文件中已有代码语句的后面。
程序注释描述了每个代码段的作用。
单击
(启动调试)。
注:
查看结果集之后,按 4 下 Enter 继续。
控制台将显示是否成功添加或删除了部门。
要生成 DDL 脚本,请打开
HRModel
的
Properties
窗口。将
Database Schema Name
更改为
HR
,并选择
SSDLtoOracle.tt
作为
DDL Generation Template
。确保在
Database Generation Workflow property
中选择了
Generate Oracle via T4(TPT).xaml
,从而确保生成“每种类型一个表”的 DDL。
这些选项确保创建的 Oracle DDL 适合 HR 模式,每种类型代表一个单独的数据库表。
Generate Database Wizard 生成 DDL 脚本,供 Oracle 数据库执行。可以将这些脚本保存到一个文件中,以便稍后运行,例如,可以通过作为 Oracle Developer Tools for Visual Studio 一部分内置的 SQL*Plus 执行引擎来运行这些脚本。
请注意,该脚本创建和删除数据库对象。默认情况下,执行删除的脚本被注释掉了。如果您要使用它们,请确保在执行前取消注释。