将 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 关系数据库模型。
先决条件
开始本教程之前,您应该:
1. |
安装 Microsoft Visual Studio 2010 以及 .NET Framework 4 或更高版本。 |
---|---|
2. |
安装 Oracle Database 10.2 或更高版本,或者安装 Oracle Database XE。 |
3. |
从 OTN 安装 Oracle 11g Oracle Data Access Components (ODAC) 11.2.0.2.30 或更高版本。ODAC 下载包括本教程中将使用的 Oracle Developer Tools for Visual Studio 和 ODP.NET。 |
4. |
将这些文件解压缩到工作目录中。 |
在 Visual Studio 中创建新项目
1. |
要创建一个新的 .NET 控制台应用程序来运行 Entity Framework 和 LINQ 应用程序表单,请打开 Visual Studio。单击File。选择 New> Project。 |
---|---|
2. |
选择 Visual C#:Windows > Console Application。将项目重命名为 EntityFramework。单击 OK。 |
3. |
项目 EntityFramework 打开。 |
创建 Oracle 连接
在创建实体数据模型之前,需要一个使用 ODP.NET 的 Oracle 数据库连接。要创建 Oracle 连接,您应该:
1. |
选择 View > Server Explorer。 |
---|---|
2. |
在 Server Explorer 窗口中,如果您已经有了一个 HR 模式连接,则将其展开并连接到数据库。例如,下面的屏幕截图将 HR 模式识别为 HR.ORCL。在 User name 和 Password 中输入 HR,然后单击 OK。跳到第 6 步。 |
3. |
如果您还没有 HR 连接,则在 Server Explorer 中右键单击 Data Connections。选择 Add Connection,然后选择一个包括 HR 模式的 Data source name,例如,ORCL。在 User name 和 Password 中输入 HR。选中 Save password。选择 Default 作为 Role,然后单击 Test Connection。 |
4. |
在 Test connection succeeded 对话框中,单击 OK。 |
5 . |
连接创建成功。展开 HR.ORCL |
6 . |
现在,您要创建在本课程后面将用于执行更新和数据检索的存储过程。要将这些存储过程添加到 HR.ORCL 数据连接中,右键单击 HR.ORCL 并选择 Query Window。 |
7 . |
打开工作目录,转到 files.zip 的解压缩位置。找到 INCREASE_SALARY_BY_10 和 UPDATE_AND_RETURN_SALARY存储过程。将 INCREASE_SALARY_BY_10 和 UPDATE_AND_RETURN_SALARY 的代码复制到 SQL Query Window中,然后针对每个存储过程单击 Execute Query ()。 |
8 . |
确保新添加的存储过程显示在 HR.ORCL > Procedures 节点下。 |
使用 Entity Data Model Wizard 创建实体数据模型
现在,您可以基于 HR 的 DEPARTMENTS 和 EMPLOYEES 表以及刚添加的两个新存储过程创建实体数据模型。为此,需要在项目中添加一个 EDM。使用 Entity Data Model Wizard 可以自动生成 EDM。
1. |
在 Solution Explorer 窗口中,右键单击 EntityFramework project 并选择 Add > New Item。 |
---|---|
2. |
在 Add New Item 窗口中,选择 ADO.NET Entity Data Model 并将其重命名为 HRModel.edmx,然后单击 Add。 |
3 . |
在 Entity Data Model Wizard 中,选择 Generate from database 并单击 Next。 |
4 . |
选择 HR.ORCL 作为数据连接。选择 Yes, include the sensitive data in the connection string,将其命名为HREntities,然后单击 Next。 |
5. |
从 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。 |
6. |
HRModel EDM 成功创建,如下图所示。 |
Entity Framework 数据检索
可以通过多种方式查询 EDM,然后通过 EDM 从数据库中检索数据。本部分将演示三种常见的 EDM 查询方法:LINQ、采用 lambda 表达式的 LINQ 以及 Entity SQL。
1. 执行 LINQ 查询
要对 Oracle 数据库执行 LINQ 查询,需要为 ODP.NET 和 Entity Framework 程序集添加一个引用。然后创建代码以执行 LINQ 查询,并将结果返回到控制台窗口。
1. |
在 Solution Explorer 窗口中,右键单击 References 并选择 Add Reference。 |
---|---|
2. |
在 .NET 选项卡页面中,选择 Oracle.DataAccess 和 System.Data.Entity 第 4 版程序集并单击 OK。 |
3. |
键入下图中高亮显示的命名空间引用。或者,您也可以复制并粘贴该信息。从您的工作目录中打开包含Programcs.txt 的文件夹。然后,复制包含命名空间引用的代码,并粘贴到 Program.cs 的顶部。 通过这些指令可以访问 ODP.NET、ADO.NET 和 Entity Framework 命名空间。 |
4. |
键入以下 .NET 代码。这些代码对刚创建的 EDM 执行一个 LINQ 查询。然后访问结果并输出到屏幕上。该 LINQ 查询检索所有 EMPLOYEE_ID 值小于 max_id 变量的员工信息。 也可以从 Programcs.txt 中复制 LINQ 查询代码并粘贴到 Program.cs 的 Main 语句后面。确保用一个右花括号来结束 USING 代码块。 单击 (启动调试)。 |
5. |
显示 LINQ 查询的输出,这表示已成功执行对 Oracle 数据库的 LINQ 查询。 |
2. 执行一个使用 lambda 表达式的 LINQ 查询,然后执行 Entity Framework 存储过程映射
LINQ 查询可以包括 lambda 表达式。Lambdas 用作标准查询运算符方法的 LINQ 参数。
通过将 Oracle 存储过程映射到 EDM 中的更新、插入和删除操作,可以对实体执行这些操作。
在本部分中,您将对 EMPLOYEE 实体执行一个使用 lambda 表达式的 LINQ 查询,然后映射一个存储过程以对所有选出的行执行更新操作。您将使用之前导入到 EDM 中的一个存储过程。
1. |
首先,创建一个用于更新数据的存储过程。当 .NET 尝试更新数据时,映射的存储过程将对 LINQ 选取的每行执行更新。 在 Solution Explorer 窗口中,选择 HRModel.edmx 并单击 Model Browser。 |
---|---|
2. |
在 HRModel.edmx 中,右键单击 EMPLOYEE 实体并选择 Stored Procedure Mapping。 |
3. |
在 Mapping Details - EMPLOYEE 窗口中,选择 <Select Update Function>,然后选择 INCREASE_SALARY_BY_10 存储过程。 |
4. |
必须在实体和 Oracle 数据库之间建立参数数据类型映射。从下拉列表中选择 EMPLOYEE_ID 作为 ID,选择 SALARY 作为 SAL。 |
5. |
键入下图中高亮显示的代码,或在 Programcs.txt 中复制以 LINQ using lambda expressions -- 开头的代码块,然后粘贴到 Program.cs 中已有代码语句的后面。单击 (启动调试) 在应用程序中,您将注意到 result.SALARY 设置为 result.SALARY。实际上,Entity Framework 执行的存储过程将工资增加了 10。在下一部分中,您将对这些行执行查询,以证明工资的确增加了 10。 注:在查看了第一个结果集之后,按 Enter 键继续。 |
6. |
LINQ 检索这两行数据,并通过执行上述存储过程更新这两行数据。文本显示工资已经更新。 |
3. 执行 Entity SQL 查询
在本部分中,将查询与前一部分相同的行,来证明存储过程已成功更新这些行。您将使用 Entity Framework 中的另一种查询方法 Entity SQL 进行查询。
1. |
键入下图中高亮显示的代码,或在 Programcs.txt 中复制以 Entity SQL -- 开头的代码块,然后粘贴到 Program.cs 中已有代码语句的后面。单击 (启动调试),查看工资增加 10 的更新结果。 注:查看输出之后,按两下 Enter 继续。 |
---|
函数导入和隐式结果集检索 | 直接插入和更新数据
通过 Entity Framework,开放人员能够定义自己的 .NET 方法来执行数据库存储过程。具体做法是在概念模型中创建函数导入,并将其映射到存储过程。在本部分中,您将定义自己的方法并映射到 Oracle 存储过程,用以执行更新。该存储过程还将使用一个隐式结果集返回修改后的数据。开发人员在 .NET 配置文件中定义结果集元数据,以便 Entity Framework 正确检索数据。
本部分介绍如何在 Entity Framework 中以编程方式修改 Oracle 数据库数据。您将对 DEPARTMENTS 表执行插入和删除操作。
1. |
您将使用 Visual Studio 的函数导入工具将存储过程映射到用户定义的 .NET 方法。由于存储过程返回一个隐式结果集,因此在使用该工具之前,需要在 .NET 配置文件中定义结果集元数据。 在 Solution Explorer 窗口中,打开 App.Config 文件。 |
---|---|
2. |
打开工作目录,转到 files.zip 的解压缩位置,找到 AppConfig.txt 文件,然后打开。复制 <oracle.dataaccess.client>代码段,然后将其粘贴到 App.Config 文件的 </connectionStrings> 标记下面。现在,您已经定义了用于检索存储过程结果集的元数据。 |
3. |
接下来,将使用函数导入工具把一个 .NET 方法映射到 Oracle 存储过程。右键单击 HRModel.edmx 并选择 Model Browser。 |
4. |
在 Model Browser 中,依次展开 HRModel.Store 和 Stored Procedures 节点。选择UPDATE_AND_RETURN_SALARY 存储过程。您已经在创建 EDM 时导入了该存储过程。 |
5. |
右键单击 UPDATE_AND_RETURN_SALARY 并选择 Add Function Import。 |
6. |
在 Add Function Import 窗口中,选择 Returns a Collection Of 部分中的 Complex。存储过程所返回的结果集中仅包含两列,而不是完整定义的实体或标量值。 单击 Get Column Information。将从 .NET 配置文件中检索列信息。 要调用 .NET 中的方法,需要使用默认的 UPDATE_AND_RETURN_SALARY 函数导入名称。 |
7. |
在 Stored Procedure Column Information 部分单击 Create New Complex Type,然后单击 OK。 |
8. |
在 Model Browser 中,您将看到 UPDATE_AND_RETURN_SALARY,它位于 HRModel.edmx > HRModel > EntityContainer:HREntities > Function Imports 下面。 |
9. |
在 Solution Explorer 窗口中,打开 Program.cs 文件。将 Programcs.txt 中以 Update salary using a stored procedure function import 开头的代码段键入或复制到已有代码语句的后面,如下图所示。您会看到,现在实体上下文中已经定义了一个 UPDATE_AND_RETURN_SALARY 方法。该方法将调用映射的存储过程并返回隐式结果集。 单击 (启动调试)。 注:查看结果集之后,按三下 Enter 继续。 |
10. |
.NET 方法返回员工姓名和更新后的工资。 |
使用 LINQ 插入和删除新的部门
1. |
将插入或删除新部门的代码键入或复制到 Program.cs 文件中。您可以从 Programcs.txt 文件复制代码,然后将其粘贴到 Program.cs 文件中已有代码语句的后面。 程序注释描述了每个代码段的作用。 单击 (启动调试)。 注:查看结果集之后,按 4 下 Enter 继续。 控制台将显示是否成功添加或删除了部门。 |
---|
Model-First
在本部分中,您将为 EMPLOYEE 实体添加一个新属性。为了在 Oracle 数据库模式中以列的形式反映这个新属性,Visual Studio 将从新的 EDM 生成 Oracle DDL 脚本。这些脚本将在 Oracle 数据库上运行,以更新关系模型。
1. |
在 HRModel.edmx 中,选择 EMPLOYEE 实体。要在 EMPLOYEE 实体中创建新属性,请右键单击该实体并选择 Add >Scalar Property。将属性命名为 ADDRESS。 |
---|---|
2. |
要生成 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 模式,每种类型代表一个单独的数据库表。 |
3. |
右键单击 HRModel.edmx 并选择 Generate Database from Model。 |
4. |
选择 Generate Database from Model 之后,将弹出 Custom Workflow Security Warning 窗口,这是因为 Oracle 定义了一个自定义工作流。单击 OK。 |
5. |
Generate Database Wizard 生成 DDL 脚本,供 Oracle 数据库执行。可以将这些脚本保存到一个文件中,以便稍后运行,例如,可以通过作为 Oracle Developer Tools for Visual Studio 一部分内置的 SQL*Plus 执行引擎来运行这些脚本。 请注意,该脚本创建和删除数据库对象。默认情况下,执行删除的脚本被注释掉了。如果您要使用它们,请确保在执行前取消注释。 |
程序员的基础教程:菜鸟程序员
将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库的更多相关文章
- 在Entity Framework 中用 Code First 创建新的数据库
在Entity Framework 中用 Code First 创建新的数据库 (原文链接) 本文将逐步介绍怎样用Code First 创建新数据库,使用在代码中定义类和API中提供的特性(Attri ...
- Entity Framework 6.x Code Frist For Oracle 实践与注意点
Entity Framework 6.x Code Frist For Oracle 实践与注意点 开发环境 Visual Studio.net 2015/2017 Oracle 11g/12c 数据 ...
- Entity Framework(EF的Model First方法)
EntityFramework,是Microsoft的一款ORM(Object-Relation-Mapping)框架.同其它ORM(如,NHibernate,Hibernate)一样, 一是为了使开 ...
- Entity Framework 5.0系列之Code First数据库迁移
我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...
- Entity Framework 6 Code First +MVC5+MySql/Oracle使用过程中的几个问题
1. namespace Snapsia.Web.Models { using System; using System.Data.Entity; using System.ComponentMode ...
- 在Entity Framework 中实现继承关系映射到数据库表
继承关系映射到数据库表中有多种方式: 第一种:TPH(table-per-hiaerachy) 每一层次一张表 (只有一张表) 仅使用名为父类的类型名的一张表,它包含了各个子类的所有属性信息,使用区分 ...
- [转]DBCP连接池的最简单应用(用于ORACLE数据库)
http://blog.csdn.net/iihero/article/details/8254107 http://www.programgo.com/article/81693457907/ 鉴于 ...
- Entity Framework Linq 动态组合where条件
public static class PredicateExtensions { public static Expression<Func<T, bool>> True&l ...
- Entity Framework Linq 简单笔记
类型查询 public class bbb:xxx {} var items = from c in context.Dbset<xxx> where c is bbb sele ...
随机推荐
- Go语言二叉树定义及遍历算法实现
// binary_tree 二叉树 package Algorithm import ( "reflect" ) // 二叉树定义 type BinaryTree struct ...
- Python 汉字转拼音
本文参考: Python中文转拼音代码(支持全拼和首字母缩写) 中文中不可以有“()” # -*- coding: utf-8 -*- __version__ = '0.9' __all__ = [& ...
- PHP 使用POST 获取不到部分数据问题
使用PHP开发的一个项目,在测试阶段客户反馈说数据没有保存成功 而我之前测试是通过的,但按客户的信息上却重现了问题 问题是这样的 客户通过浏览器进行保存,但有些数据已经保存成功,但某些数据却没有保存成 ...
- CentOS7中设置Tomcat8开机自启动
CentOS7中设置Tomcat8开机自启动 本文介绍了在centos7中配置tomcat的开机自启动的一些操作步骤,仅供参考. 环境是CentOS 7 ,jdk版本是1.8.0_191,tomcat ...
- [Java] zjdbcping:JDBC数据库连接测试工具
作者: zyl910 一.缘由 当数据库服务器很多时,或者要与第三方公司做数据库表交换时,此时觉得若有一个简单快捷的数据库连接测试工具就好了. 因为若是采取直接把程序部署到tomcat等容器再测试的办 ...
- kafka注册异常
问题描述: kafka注册异常,提示brokers id已经被注册过 -- ::,] FATAL [Kafka Server ], Fatal error during KafkaServer sta ...
- 关于Discuz! X系列远程代码执行漏洞
一.漏洞起源 突然有同事反馈,无法注册 看到这里不了解的同行估计一年懵逼,这里也是常用的漏洞攻击,可以肯定的是 badwords.php文件被修改了 ,可以查看这个文件内容 <?php $_C ...
- P2P贷款全攻略,贷前、贷中、贷后工作事项解析
一.贷前调查事项 贷前调查是所有银行.小贷.P2P等等往出贷款部门的重中之重. 归根结底就是两条:让不对称信息最大限度对称.让软信息最大限度真实还原. 客户还不还款就是取决两大因素:还款能力.还款意愿 ...
- numpy累积
numpy累积有两类函数:np.cumxxxxx和np.ufunc.accumulate() import numpy as np a = np.arange(1, 5) print(np.cumpr ...
- Effective Java 第三版—— 84. 不要依赖线程调度器
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...