ef6 oracle 存储过程,Entity Framework入门教程(14)---DbFirst下的存储过程
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下的存储过程相关推荐
- Entity Framework入门教程:创建实体数据模型
下图为一个已经创建好的数据库表关系 实体数据模型的创建过程 在Visual Studio项目中,右键程序集菜单,选择[添加]->[新建项],在[添加新项窗口]中选择[ADO.NET实体数据模型] ...
- ASP .NET MVC 之Entity Framework入门教程及源码
本文主要的目的是 1. 说明Entity Framework Power Tools如何使用. 2. Entity Framework 快速门 实验环境: OS: Windows Server 20 ...
- ADO.NET Entity Framework 入门示例向导(附Demo程序下载)
ADO.NET Entity Framework 入门示例向导(附Demo程序下载) ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架, ...
- Swoole Framework 入门教程(1)
Swoole Framework入门教程1 简介 Swoole为广大php 程序员带来了福音, 用一句话说 重新定义PHP, 底层用c扩展实现,配合PHP7 性能不弱于 golang ,并且还可以脱离 ...
- ADO.NET Entity Framework 入门示例
ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架,它使开发人员可以通过对象模型(而不是逻辑/关系数据模型)专注于数据.实体框架Entit ...
- Zend Framework 入门教程(简体中文版)
Zend Framework 入门教程(简体中文版) Getting Started With the Zend Framework Author:Rob Allen, www.akrabat.com ...
- Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE
Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE Windows平台下安装Arduino IDE Windows操作系统下可以使用安装向导和压缩包形式安装.下面详细讲解这 ...
- Zend Framework入门教程
转战了各个Blog平台,发现还是落户到csdn上吧,以后吐槽在新浪,发长文在csdn,整理链接在Baidu Hi 在大四的时候接下的实验室网站,网站是上三届的吴师兄写的,主要采用的是LAMP,其中PH ...
- .NET Entity Framework入门简介及简单操作
Entity Framework是微软借鉴ORM思想开发自己的一个ORM框架. ORM就是将数据库表与实体对象(相当于三层中的Model类)相互映射的一种思想. 最大的优点就是非常方便的跨数据库平台. ...
最新文章
- iOS视频流采集概述(AVCaptureSession)
- mysql安装必要组件_openstack必须安装哪些组件
- linux关机 hibernate,Linux关机命令
- index 把@前的截断作为
- TIMING_06 VIVADO环境下的时序约束 之 输入延迟约束
- netcore使用 jenkins + supervisor 实现standalone下多副本自动化发布
- 使用Travis-CI的SpringBoot应用程序的CI / CD
- 3.16 按绩点排名
- 【编辑器】VSCode制表符Tab等修改
- GNS3环境安装流程
- SCI论文下载之chrome插件
- linux超级块编辑,在EXT4 linux系统上模拟丢失的超级块错误
- 无言以队Alpha阶段项目复审
- 【机器学习】ROC曲线和AUC面积
- 计算机休眠设置xp系统,【xp怎么让电脑不休眠】xp怎么设置电脑不休眠_xp电脑休眠设置...
- FFT 采样频率和采样点数的选取
- 转账功能怎么测试?以支付宝转账到银行卡为例
- 区块链行业报告浅见输出
- mysql 简述pk uk fk 的区别和对数据库性能的影响_数据库pk fk ak
- matlab中surf出来要有颜色,matlab中surf什么意思