Entity Framework 5.0.0 Function Import 以及 ODP. NET Implicit REF CURSOR Binding使用简介
概要:
1,说明如何使用Entity Framework中的function import功能。
2,说明如何使用ODP.NET的隐式REF CURSOR绑定(implicit REF CURSOR binding)。
环境以及工具:
Windows 10 企业版
Microsoft Visual Studio Enterprise 2015
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
.NET Framework 4.0
ODP.NET(Nuget Package Id: Oracle.ManagedDataAccess; Nuget Package Version: 12.1.2400)
Entity Framework(Nuget Package Id: EntityFramework; Nuget Package Version: 5.0.0)
其他要求:Oracle数据库中的HR schema访问权限。
1,创建一个Winform项目名称为FunctionImportTest,.NET版本是4.0。
2, 打开Nuget Package Manager控制台。
依次执行如下两个命令分别安装EF和ODP.NET的包:
install-package -id EntityFramework -version 5.0.0 -projectname FunctionImportTest
install-package -id Oracle.ManagedDataAccess -projectname FunctionImportTest
3,在Oracle数据库中的HR方案里面创建一个存储过程。
此存储过程有一个类型为隐式游标变量的出参。
CREATE OR REPLACE PROCEDURE "HR"."PROC_GET_EMP_BY_DEPT_NAME"
(
DEPT_NAME IN VARCHAR2 DEFAULT NULL,
CUR_EMPS OUT SYS_REFCURSOR
) AS
SQL_STMT VARCHAR2(256) := 'SELECT t1.first_name, t1.last_name, t2.department_name FROM employees t1 ' ||
'JOIN departments t2 ON t1.department_id = t2.department_id ';
BEGIN
IF DEPT_NAME IS NOT NULL THEN
SQL_STMT := SQL_STMT || 'WHERE t2.department_name = ' || '''' || DEPT_NAME || '''';
END IF; OPEN CUR_EMPS FOR SQL_STMT;
END "PROC_GET_EMP_BY_DEPT_NAME";
4,从数据库生成概念模型
(1),在项目名称上点击右键,选择Add-->Add Item。选择ADO.NET Entity Data Model,并把Name设置为HRModel,然后点击Add。
(2),选择从数据库生成模型,点击NEXT。
(3),选择数据库连接。本文使用Oracle数据库中的HR方案。
(4),选择Entity Framework版本。
(5),选择数据库对象及设置。选择上文已经创建的HR.PROC_GET_EMP_BY_DEPT_NAME存储过程,并点击FINISH。
5,此时已经导入了Oracle中的存储过程。然后把存储过程的出参CUR_EMPS映射为具体的类。
导入之后的样子如下图所示:
6,配置app.config文件,设置存储过程的隐式游标参数的元数据信息。
以下是app.config文件中oracle.manageddataaccess.client部分的配置。在设置属性值时,VS基本都有提示。
在implicitRefCursor元素中配置隐式游标变量的绑定信息和元数据。
<oracle.manageddataaccess.client>
<version number="*">
<dataSources>
<dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
</dataSources>
<implicitRefCursor>
<!--
注意:方案名称和存储过程的名称是大小写敏感的。
如果要保留方案名称和存储过程名称中的小写字母,则添加"。
例如<storedProcedure schema=""SchemaName"" name=""StoredProcedureName"">
否则,EF框架会默认把这些名称转换为大写形式。
-->
<storedProcedure schema="HR" name="PROC_GET_EMP_BY_DEPT_NAME">
<!-- 游标参数的名称是大小写敏感的。 -->
<refCursor name="CUR_EMPS">
<bindInfo mode="Output"/>
<!-- 参数的序数从0开始 -->
<metadata columnName="FIRST_NAME" columnOrdinal="0" columnSize="20" nativeDataType="Varchar2" providerType="Varchar2" providerDBType="String" dataType="System.String" />
<metadata columnName="LAST_NAME" columnOrdinal="1" columnSize="25" nativeDataType="Varchar2" providerType="Varchar2" providerDBType="String" dataType="System.String" />
<metadata columnName="DEPARTMENT_NAME" columnOrdinal="2" columnSize="30" nativeDataType="Varchar2" providerType="Varchar2" providerDBType="String" dataType="System.String" />
</refCursor>
</storedProcedure>
</implicitRefCursor>
</version>
</oracle.manageddataaccess.client>
7,把函数导入映射为类型。
(1),修改function import。切换到Model Browser窗口。在Function Imports下面刚才导入的存储过程名称上点击右键,然后点击Edit。
(2),修改function import,并生成Complext Type。
① 修改Function Import Name。
② 选择Returns a Collection Of下面的Complex。
③ 点击Get Column Information。
④ 点击Create New Complex Type。
⑤ 把Complex Type的名称修改为EmployeeBasicInfo。
⑥ 点击OK。
此时,Complex Types下面多了一个类型。
8,剩下的部分就是简单的Winform开发了。调用GetEmpByDeptName方法获取数据,然后和DataGridView控件绑定,把数据显示出来。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace FunctionImportTest
{
public partial class FunctionImportForm : Form
{
// 先创建DbContext
private HREntities context = new HREntities(); public FunctionImportForm()
{
InitializeComponent();
} private void OnLoad(object sender, EventArgs e)
{
try
{
this.Query(null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void OnClickQueryButton(object sender, EventArgs e)
{
try
{
string deptName = this.textBoxDeptNameCondition.Text;
this.Query("".Equals(deptName) ? null : deptName);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void Query(string deptName)
{
this.dataGridViewEmpBasicInfo.DataSource = context.GetEmpByDeptName(deptName);
}
}
}
Entity Framework 5.0.0 Function Import 以及 ODP. NET Implicit REF CURSOR Binding使用简介的更多相关文章
- Entity Framework Core 2.0 全局查询过滤器
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunnarpeipman.com/2017/08/ef ...
- .Net Core 2.0生态(4):Entity Framework Core 2.0 特性介绍和使用指南
前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升级EF也发展到EF6.x,Entity Framework Core是一个支持跨平台的全新版本, ...
- Entity Framework Core 2.0 中使用LIKE 操作符
Entity Framework Core 2.0 中使用LIKE 操作符 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译 ...
- Entity Framework Core 2.0 使用代码进行自动迁移
一.前言 我们在使用EF进行开发的时候,肯定会遇到将迁移更新到生产数据库这个问题,前面写了一篇文章介绍了Entity Framework Core 2.0的入门使用,这里面介绍了使用命令生成迁移所需的 ...
- ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.
在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...
- ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
ASP.NET 5.0 将改名为 ASP.NET Core 1.0 ASP.NET MVC 6 将改名为 ASP.NET MVC Core 1.0 Entity Framework 7.0 将 ...
- [转帖]2016年时的新闻:ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
ASP.NET Core 1.0.ASP.NET MVC Core 1.0和Entity Framework Core 1.0 http://www.cnblogs.com/webapi/p/5673 ...
- 【EF】Entity Framework Core 2.0 特性介绍和使用指南
阅读目录 前言 获取和使用 新特性 项目升级和核心API变化 下一步计划 遗憾的地方 回到目录 前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升 ...
- Entity Framework Core 2.0 使用入门
一.前言 Entity Framework(后面简称EF)作为微软家的ORM,自然而然从.NET Framework延续到了.NET Core.以前我也嫌弃EF太重而不去使用它,但是EF Core(E ...
随机推荐
- Mysql加锁过程详解(7)-初步理解MySQL的gap锁
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- 翻译:update语句(已提交到MariaDB官方手册)
本文为mariadb官方手册:UPDATE的译文. 原文:https://mariadb.com/kb/en/update/ 我提交到MariaDB官方手册的译文:https://mariadb.co ...
- 《C#并发编程经典实例》学习笔记-第一章并发编程概述
并发编程的术语 并发 同时做多件事情 多线程 并发的一种形式,它采用多个线程来执行程序. 多线程是并发的一种形式,但不是唯一的形式. 并行处理 把正在执行的大量的任务分割成小块,分配给多个同时运行的线 ...
- 验证码图片二值化问题 BitmapData 怎么解决
对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色 ...
- .NET面试题01-值类型与引用类型
常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...
- Java类加载机制(加载、验证、准备、解析、初始化)
如下图所示,Java的类加载机制主要分为三个部分,分别为加载.链接.初始化.其中链接又分为三个小部分--验证.准备.解析. 加载--在经过对Java代码进行编译后,JVM将Java类编译后的二进制文件 ...
- Redis 持久化之RDB和AOF
Redis 持久化之RDB和AOF Redis 有两种持久化方案,RDB (Redis DataBase)和 AOF (Append Only File).如果你想快速了解和使用RDB和AOF,可以直 ...
- Hibernate(十四)抓取策略
抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一 ...
- 继承、接口、static、abstract
继承: 1.用extends来完成继承 2.子类可以继承父类全部的数据域但是只有部分的数据域对子类可见 3.在java中支持单继承 4.单继承和多继承的比较 (1)多继承比单继承能够更好的提高代码的复 ...
- 3.类和接口_EJ
第13条: 使类和成员的可访问性最小化 良好的模块设计能隐藏其内部数据和其他实现细节,模块之间只通过它们的API进行通信.java语言提供了许多机制来协助隐藏信息.访问控制机制决定了类.接口和成员的可 ...