源代码

概要:

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>
<!--
注意:方案名称和存储过程的名称是大小写敏感的。
如果要保留方案名称和存储过程名称中的小写字母,则添加&quot;。
例如<storedProcedure schema="&quot;SchemaName&quot;" name="&quot;StoredProcedureName&quot;">
否则,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使用简介的更多相关文章

  1. Entity Framework Core 2.0 全局查询过滤器

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunnarpeipman.com/2017/08/ef ...

  2. .Net Core 2.0生态(4):Entity Framework Core 2.0 特性介绍和使用指南

    前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升级EF也发展到EF6.x,Entity Framework Core是一个支持跨平台的全新版本, ...

  3. Entity Framework Core 2.0 中使用LIKE 操作符

    Entity Framework Core 2.0 中使用LIKE 操作符 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译 ...

  4. Entity Framework Core 2.0 使用代码进行自动迁移

    一.前言 我们在使用EF进行开发的时候,肯定会遇到将迁移更新到生产数据库这个问题,前面写了一篇文章介绍了Entity Framework Core 2.0的入门使用,这里面介绍了使用命令生成迁移所需的 ...

  5. ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.

    在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...

  6. 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    将 ...

  7. [转帖]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 ...

  8. 【EF】Entity Framework Core 2.0 特性介绍和使用指南

    阅读目录 前言 获取和使用 新特性 项目升级和核心API变化 下一步计划 遗憾的地方 回到目录 前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升 ...

  9. Entity Framework Core 2.0 使用入门

    一.前言 Entity Framework(后面简称EF)作为微软家的ORM,自然而然从.NET Framework延续到了.NET Core.以前我也嫌弃EF太重而不去使用它,但是EF Core(E ...

随机推荐

  1. Mysql加锁过程详解(7)-初步理解MySQL的gap锁

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  2. 翻译:update语句(已提交到MariaDB官方手册)

    本文为mariadb官方手册:UPDATE的译文. 原文:https://mariadb.com/kb/en/update/ 我提交到MariaDB官方手册的译文:https://mariadb.co ...

  3. 《C#并发编程经典实例》学习笔记-第一章并发编程概述

    并发编程的术语 并发 同时做多件事情 多线程 并发的一种形式,它采用多个线程来执行程序. 多线程是并发的一种形式,但不是唯一的形式. 并行处理 把正在执行的大量的任务分割成小块,分配给多个同时运行的线 ...

  4. 验证码图片二值化问题 BitmapData 怎么解决

    对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色 ...

  5. .NET面试题01-值类型与引用类型

    常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...

  6. Java类加载机制(加载、验证、准备、解析、初始化)

    如下图所示,Java的类加载机制主要分为三个部分,分别为加载.链接.初始化.其中链接又分为三个小部分--验证.准备.解析. 加载--在经过对Java代码进行编译后,JVM将Java类编译后的二进制文件 ...

  7. Redis 持久化之RDB和AOF

    Redis 持久化之RDB和AOF Redis 有两种持久化方案,RDB (Redis DataBase)和 AOF (Append Only File).如果你想快速了解和使用RDB和AOF,可以直 ...

  8. Hibernate(十四)抓取策略

    抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一 ...

  9. 继承、接口、static、abstract

    继承: 1.用extends来完成继承 2.子类可以继承父类全部的数据域但是只有部分的数据域对子类可见 3.在java中支持单继承 4.单继承和多继承的比较 (1)多继承比单继承能够更好的提高代码的复 ...

  10. 3.类和接口_EJ

    第13条: 使类和成员的可访问性最小化 良好的模块设计能隐藏其内部数据和其他实现细节,模块之间只通过它们的API进行通信.java语言提供了许多机制来协助隐藏信息.访问控制机制决定了类.接口和成员的可 ...