源代码

概要:

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. Golang中的自动伸缩和自防御设计

    Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...

  2. Deep learning with Python 学习笔记(11)

    总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...

  3. MySQL行转列

    IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则 ...

  4. @property详解,@property修饰符以及各个修饰符区别(上)

    相信很多参加过面试的人员很多都会被问到:weak与assign的区别,copy与strong的区别.如果你仅仅说一点点copy一般对NSString,weak对于控件的修饰,assign对于基本类型, ...

  5. Web网站配置Gzip,压缩js css文件

    启用apache的gzip 找到httpd.conf,打开文件找到对mod_deflate的注释 #LoadModule deflate_module modules/mod_deflate.so 去 ...

  6. 23.QT记事本

    描述 主要功能有: 新建,打开,保存,另存为,打印, 编辑,撤销,,拖放,xml配置文件读写,字体更改,查找替换 菜单栏,工具栏,状态栏的实现 如下图所示: 效果如下所示:   源码下载地址: htt ...

  7. Spring核心——Bean的定义与控制

    在Sring核心与设计模式的文章中,分别介绍了Ioc容器和Bean的依赖关系.如果阅读过前2文就会知道,Spring的整个运转机制就是围绕着IoC容器以及Bean展开的.IoC就是一个篮子,所有的Be ...

  8. Python 字典(Dictionary) 基本操作

    Python字典是一种可变容器模型,可存储任意类型对象:如字符串.数字.元组等.它以键值对(key-value)的形式存在,因此相当于Hashmap在python中的实现. §1. 创建字典  字典由 ...

  9. 2018-08-06 在Office的VBA代码里中文命名

    在Excel处理数据时, 顺便试了一下VBA代码编辑器里输入中文, 结果显示为乱码. 查了一下发现VBA本身支持Unicode, 但需要设置系统配置使编辑器能够正常显示, 即设置简体中文为Curren ...

  10. CSS琐碎知识点(持续补充)

    一.字体单位,pt?px?em?rem? pt:磅,一种固定长度的绝对的度量单位,是能够使用测量设备测得的长度,印刷业上经常使用,一般用于页面打印排版. px:屏幕设备上能显示出的最小的一个物理点,这 ...