EF6中DbFirst模式下使用存储过程

我们已经知道EF可以将L2E或Entity SQL的查询语句自动转换成SQL命令,也可以根据实体的状态自动生成Insert/update/delete的Sql命令。这节介绍EF中使用预先定义的存储过程对一张或者多种表进行CURD操作。

EF API会新建一个function来映射数据库中的自定义函数或存储过程。下边讲解EF DbFirst模式下存储过程的用法,EF CodeFirst存储过程的用法会在以后的EF CodeFirst系列中介绍。

1.DbFirst模式——使用存储过程查询数据

第一步 在数据库新建存储过程

首先在数据库创建一个名为GetCoursesByStudentId的存储过程,这个存储过程返回一个学生的所有课程。

CREATE PROCEDURE [dbo].[GetCoursesByStudentId]

--Add the parameters for the stored procedure here

@StudentId int = null

AS

BEGIN

--SET NOCOUNT ON added to prevent extra result sets from

--interfering with SELECT statements.

SET NOCOUNT ON;--Insert statements for procedure here

selectc.courseid, c.coursename,c.Location, c.TeacherIdfromstudent sleft outer join studentcourse sc on sc.studentid =s.studentidleft outer join course c on c.courseid =sc.courseidwhere s.studentid = @StudentId

END

第二步 生成EMD

这一步和普通生成EMD过程是一样的,值得注意的是在Choose Your Database Objects and Settings这一步勾选我们新建的存储过程(GetCoursesByStudentId)和下边的Import selected stored procedures and functions into the entity model ,如下图所示

GetCoursesByStudentId()返回Course实体集合,所以我们不需要返回一个新的复杂类型。右键Function Imports下的GetCoursesByStudentId方法,选择Edit,出现以下界面,把Entities设置为Course即可

通过上边两步,在context中会生成一个GetCoursesByStudentId方法:

现在我们就可以愉快地使用context.GetCoursesByStudentId来执行存储过程了!如下:

using (var context = newSchoolDBEntities())

{var courses = context.GetCoursesByStudentId(1);foreach (Course cs incourses)

Console.WriteLine(cs.CourseName);

}

在数据库中执行的命令为: exec [dbo].[GetCoursesByStudentId] @StudentId=1

一点补充:EF中的表值函数和查询的存储过程使用的步骤是一模一样的(表值函数和存储过程本来就很类似,一个最重要的区别是EF中表值函数的返回值可用linq查询过滤)

2.DbFirst模式——使用存储过程执行CUD操作

这一部分介绍怎么通过存储过程来执行CUD(creat,update,delete)操作。

我们在数据库添加以下几个存储:

Sp_InsertStudentInfo(添加):

CREATE PROCEDURE [dbo].[sp_InsertStudentInfo]

--Add the parameters for the stored procedure here

@StandardId int = null,@StudentName varchar(50)AS

BEGIN

--SET NOCOUNT ON added to prevent extra result sets from

--interfering with SELECT statements.

SET NOCOUNT ON;INSERT INTO [SchoolDB].[dbo].[Student]([StudentName],[StandardId])VALUES(@StudentName, @StandardId)SELECT SCOPE_IDENTITY() ASStudentIdEND

sp_UpdateStudent(修改):

CREATE PROCEDURE [dbo].[sp_UpdateStudent]

--Add the parameters for the stored procedure here

@StudentId int,@StandardId int = null,@StudentName varchar(50)AS

BEGIN

--SET NOCOUNT ON added to prevent extra result sets from

--interfering with SELECT statements.

SET NOCOUNT ON;Update [SchoolDB].[dbo].[Student]

set StudentName = @StudentName,StandardId = @StandardId

where StudentID = @StudentId;END

sp_DeleteStudent(删除):

CREATE PROCEDURE [dbo].[sp_DeleteStudent]

--Add the parameters for the stored procedure here

@StudentId int

AS

BEGIN

--SET NOCOUNT ON added to prevent extra result sets from

--interfering with SELECT statements.

SET NOCOUNT ON;DELETE FROM [dbo].[Student]

where StudentID = @StudentId

END

第一步:升级EDM

首先我们要升级EDM把这些存储过程添加当我们的EDM中。右键设计器,选择Update Model from Database,就出现了升级界面,如下图所示,展开Stored Procedure and Functions,勾选我们上边创建的三个存储过程,然后点击Finish。

这时模型浏览器中在Store Model中有了这三个存储过程,但是Function Imports中没有,如下所示:

打开模型设计器在Student实体上右键,选择Stored Procedure Mapping,来打开映射详情界面,如下图

在下面的映射详细界面,我们看到, , and ,给这些下拉菜单分别选择对应的存储过程,同时选择存储过程的输入输出参数,如下图所示:

右击Student实体,选择Validate,确保没有错误

现在我们执行add,update,或者delete时,EF不再执行自动生成的SQL命令,而是通过这些存储过程来执行,下面是一个栗子:

using (var context = newSchoolDBEntities())

{

Student student= new Student() { StudentName = "New student using SP"};

context.Students.Add(student);//执行sp_InsertStudentInfo

context.SaveChanges();

student.StudentName= "Edit student using SP";//执行sp_UpdateStudent

context.SaveChanges();

context.Students.Remove(student);//执行sp_DeleteStudentInfo

context.SaveChanges();

}

调用SaveChange()方法时,在数据库中执行的命令如下:

exec [dbo].[sp_InsertStudentInfo] @StandardId=NULL,@StudentName='New student using SP'

go

exec [dbo].[sp_UpdateStudent] @StudentId=47,@StandardId=NULL,@StudentName='Edit student using SP'

go

exec [dbo].[sp_DeleteStudent] @StudentId=47

go

注意:无论是使用存储过程还是默认生成的Sql命令,当插入一条记录并执行完SaveChange()方法后,这个新的实例会立即分配一个Id。这样设计是为了有效地追踪实体,让我们可以对实体执行进一步的操作(如没有id执行update会抛出异常),如下图:

ef6 oracle 存储过程,Entity Framework入门教程(14)---DbFirst下的存储过程相关推荐

  1. Entity Framework入门教程:创建实体数据模型

    下图为一个已经创建好的数据库表关系 实体数据模型的创建过程 在Visual Studio项目中,右键程序集菜单,选择[添加]->[新建项],在[添加新项窗口]中选择[ADO.NET实体数据模型] ...

  2. ASP .NET MVC 之Entity Framework入门教程及源码

    本文主要的目的是 1. 说明Entity Framework Power Tools如何使用. 2. Entity Framework  快速门 实验环境: OS: Windows Server 20 ...

  3. ADO.NET Entity Framework 入门示例向导(附Demo程序下载)

    ADO.NET Entity Framework 入门示例向导(附Demo程序下载) ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架, ...

  4. Swoole Framework 入门教程(1)

    Swoole Framework入门教程1 简介 Swoole为广大php 程序员带来了福音, 用一句话说 重新定义PHP, 底层用c扩展实现,配合PHP7 性能不弱于 golang ,并且还可以脱离 ...

  5. ADO.NET Entity Framework 入门示例

    ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架,它使开发人员可以通过对象模型(而不是逻辑/关系数据模型)专注于数据.实体框架Entit ...

  6. Zend Framework 入门教程(简体中文版)

    Zend Framework 入门教程(简体中文版) Getting Started With the Zend Framework Author:Rob Allen, www.akrabat.com ...

  7. Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE

    Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE Windows平台下安装Arduino IDE Windows操作系统下可以使用安装向导和压缩包形式安装.下面详细讲解这 ...

  8. Zend Framework入门教程

    转战了各个Blog平台,发现还是落户到csdn上吧,以后吐槽在新浪,发长文在csdn,整理链接在Baidu Hi 在大四的时候接下的实验室网站,网站是上三届的吴师兄写的,主要采用的是LAMP,其中PH ...

  9. .NET Entity Framework入门简介及简单操作

    Entity Framework是微软借鉴ORM思想开发自己的一个ORM框架. ORM就是将数据库表与实体对象(相当于三层中的Model类)相互映射的一种思想. 最大的优点就是非常方便的跨数据库平台. ...

最新文章

  1. iOS视频流采集概述(AVCaptureSession)
  2. mysql安装必要组件_openstack必须安装哪些组件
  3. linux关机 hibernate,Linux关机命令
  4. index 把@前的截断作为
  5. TIMING_06 VIVADO环境下的时序约束 之 输入延迟约束
  6. netcore使用 jenkins + supervisor 实现standalone下多副本自动化发布
  7. 使用Travis-CI的SpringBoot应用程序的CI / CD
  8. 3.16 按绩点排名
  9. 【编辑器】VSCode制表符Tab等修改
  10. GNS3环境安装流程
  11. SCI论文下载之chrome插件
  12. linux超级块编辑,在EXT4 linux系统上模拟丢失的超级块错误
  13. 无言以队Alpha阶段项目复审
  14. 【机器学习】ROC曲线和AUC面积
  15. 计算机休眠设置xp系统,【xp怎么让电脑不休眠】xp怎么设置电脑不休眠_xp电脑休眠设置...
  16. FFT 采样频率和采样点数的选取
  17. 转账功能怎么测试?以支付宝转账到银行卡为例
  18. 区块链行业报告浅见输出
  19. mysql 简述pk uk fk 的区别和对数据库性能的影响_数据库pk fk ak
  20. matlab中surf出来要有颜色,matlab中surf什么意思

热门文章

  1. requestAnimationFrame 优化Web动画
  2. Chrome 前端 插件
  3. IOS10.8.2安装
  4. 我的春Phone之行
  5. IDC服务器共享带宽和独享带宽的区别
  6. RS232通信之C++实现---PC端
  7. C++ Builder 实现动态生成窗口、控件,以及处理控件事件(转载)
  8. NS2 分裂机制及代码分析一---解释类成员变量与编译类成员变量互操作
  9. 常用功能-删除功能测试点
  10. SQL查询中用replace替换ntext,text字段的各种方法总结