源代码

概要:

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. WEB安全之垃圾信息防御措施

    防止垃圾评论与机器人的攻击手段如下: 1)IP限制.其原理在于IP难以伪造.即使是对于拨号用户,虽然IP可变,但这也会大大增加共攻击的工作量. 2)验证码.其重点是让验证码难于识别,对于“字母+数字” ...

  2. Appcan开发笔记:导出Excel文件

    Appcan IDE为4.0+; appcan提供了导出文件的方法 appcan.file.write 文件会自动创建,要解决的事情是Excel用字符串输出,可以考虑 csv(逗号间隔).HTML.X ...

  3. Dijkstra——单源最短路径

    算法思想 ①从一个源点开始,找距离它最近的点顶点v ②然后以顶点v为起点,去找v能到达的顶点w,即v的邻居 比较源点直接到 v的距离和(源点到v的距离+v到w的距离) 若大于后者则更新源点的到w的开销 ...

  4. 跨域 webpack + vue-cil 中 proxyTable 处理跨域

    博客地址:https://ainyi.com/27 跨域 了解同源政策:所谓"同源"指的是"三个相同". 协议相同 域名相同 端口相同 解决跨域 jsonp 缺 ...

  5. Java虚拟机——类的结构与加载

    1.为什么Java可以跨平台 因为有java虚拟机,跨平台是因为字节码即class文件具有平台无关性,java代码会经过java虚拟机转换为字节码 2.class文件的结构 class文件主要是以8位 ...

  6. [转]Build An Image Manager With NativeScript, Node.js, And The Minio Object Storage Cloud

    本文转自:https://www.thepolyglotdeveloper.com/2017/04/build-image-manager-nativescript-node-js-minio-obj ...

  7. nginx静态资源文件无法访问,403 forbidden错误

    在安装 nginx 服务器后,我想把网站的根目录设置为 /root/www/ ,于是对 nginx 的 nginx.conf 文件进行配置 先打开 nginx.conf #user nobody; w ...

  8. EF to Sqlite

    测试下来,使用到下面的版本: EF6.1 System.Data.SQLite.EF6.1.0.93.0 System.Data.SQLite.Core.1.0.93.0  注意事项: 设置Autoi ...

  9. UML 序列图

    序列图      序列图主要用于按照交互发生的一系列顺序,显示对象之间的这些交互.显示不同的业务对象如何交互,对于交流当前业务如何进行很有用.序列图是一个用来记录系统需求,和整理系统设计的好图.序列图 ...

  10. C# winform程序怎么打包成安装项目(VS2010图解)

    作为研发人员,在本机上开发的winform.wpf或者控制台程序需要发给其他人测试时候,一般需要对其进行打包生成setup安装文件,根据网上查找的资料并结合自己打包成功,记录如下: 注:本程序是一个利 ...