前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单的。呵呵,之前我们使用数据库的时候,有时会使用存储过程代替在代码中直接使用SQL语句。

使用存储过程的好处:

提高效率:因为存储过程是经过编译优化后,存储在数据库服务器的。SQL语句在执行的时候,需要临时编译。一般来说,存储过程的效率比SQL语句效率高。
降低日后维护的难度:因为对存储过程的修改不需要修改应用程序代码。我们在程序代码中直接调用的是存储过程名字,和参数列表(如果是带参数的存储过程),在维护的时候,可以不修改存储过程的名字和参数列表,而是修改存储过程的具体实现细节,从而达到维护的目的。
我们首先来创建几个Category存储过程:

1. 打开SQL server2008 Management Studio,我们使用Northwind 数据库。

依次展开节点,如下图:

此时打开新建存储过程的窗口如下图:

上面图中已经标出有三部分:1.存储过程名字。 2. 存储过程参数。3.存储过程体。只要补充这三部分,然后执行脚本,就创建了该存储过程。

我们先添加一个插入Category的存储过程,代码如下:

复制代码
1 SET ANSI_NULLS ON
2 GO
3 SET QUOTED_IDENTIFIER ON
4 GO
5 -- =============================================
6 -- Author:
7 -- Create date:
8 -- Description:
9 -- =============================================
10 CREATE PROCEDURE InsertCategory
11 -- Add the parameters for the stored procedure here
12 @cateName varchar(15),
13 @cateDesc ntext
14 AS
15 BEGIN
16 -- SET NOCOUNT ON added to prevent extra result sets from
17 -- interfering with SELECT statements.
18 SET NOCOUNT ON;
19
20 -- Insert statements for procedure here
21 insert into dbo.Categories (CategoryName,Description)values(@cateName,@cateDesc)
22 END
23 GO
复制代码
(小技巧:在你写表名和列名的名字的时候,名字太长,不方便的话。你可以直接使用鼠标左键拖拽表名或列名到右边的编辑窗口,然后松开鼠标即可。)

好了,InertCategory这个存储过程的创建脚本已经写完,然后,我们执行下该存储过程的。如果在下面的提示框中有:Command(s) completed successfully.,则表示创建成功,然后“刷新左边,就会发现已经创建的存储过程已经出现了”如下图:

在新建的存储过程上右键,可以修改、或执行该存储过程。我们选择执行。如下图

点击“OK”,成功以后,查看数据库,新记录已经插入成功。

同样的方式,我们创建删除Category的存储过程:DeleteCategory,代码如下:

复制代码
1 SET ANSI_NULLS ON
2 GO
3 SET QUOTED_IDENTIFIER ON
4 GO
5 -- =============================================
6 -- Author:
7 -- Create date:
8 -- Description:
9 -- =============================================
10 CREATE PROCEDURE DeleteCategory
11 -- Add the parameters for the stored procedure here
12 @cateID int
13 AS
14 BEGIN
15 -- SET NOCOUNT ON added to prevent extra result sets from
16 -- interfering with SELECT statements.
17 SET NOCOUNT ON;
18
19 -- Insert statements for procedure here
20 delete from dbo.Categories where CategoryID =@cateID
21 END
22 GO
复制代码
我们创建更新Category的存储过程:DeleteCategory,代码如下:

复制代码
1 SET ANSI_NULLS ON
2 GO
3 SET QUOTED_IDENTIFIER ON
4 GO
5 -- =============================================
6 -- Author:
7 -- Create date:
8 -- Description:
9 -- =============================================
10 CREATE PROCEDURE UpdateCategory
11 -- Add the parameters for the stored procedure here
12 @cateID int,
13 @cateName nvarchar(15),
14 @cateDesc ntext
15 AS
16 BEGIN
17 -- SET NOCOUNT ON added to prevent extra result sets from
18 -- interfering with SELECT statements.
19 SET NOCOUNT ON;
20
21 -- Insert statements for procedure here
22 update dbo.Categories set CategoryName =@cateName, Description=@cateDesc
23 where CategoryID=@cateID
24 END
25 GO
复制代码
我们创建选择Category的存储过程:DeleteCategory,代码如下:

复制代码
1 SET ANSI_NULLS ON
2 GO
3 SET QUOTED_IDENTIFIER ON
4 GO
5 -- =============================================
6 -- Author:
7 -- Create date:
8 -- Description:
9 -- =============================================
10 CREATE PROCEDURE SelectCategory
11 -- Add the parameters for the stored procedure here
12
13 AS
14 BEGIN
15 -- SET NOCOUNT ON added to prevent extra result sets from
16 -- interfering with SELECT statements.
17 SET NOCOUNT ON;
18
19 -- Insert statements for procedure here
20 SELECT * from dbo.Categories
21 END
22 GO
复制代码
好了,我们就创建这些存储过程。
2.我们创建一个项目,来通过EF4使用这些存储过程。

打开visual studio2010,创建windows form应用程序:EFStoredProcedureDemo.

在项目:EFStoredProcedureDemo上面右键--》添加新项,选择:Ado.net Entity Data Model,名称:Northwind,

然后点下一步:此时点击“New Connection” 找数据库服务器,再找到Northwind数据库。如下图:

点击下一步:

在tables里选择Category,如下图:

在Stored Procedure里面选择刚才创建的四个存储过程。

选中“Pluralize or singularize generated object names”和“Include foreign key columns in the model”, 点击finish.生成*.edmx,并自动打开设计视图:

在设计器选中实体Category,点击右键:选择Table Mapping .在Mapping 窗口中有两项:Mapping entity to tables和Mapping entity to Functions。选择Mapping entity to Functions,如下图:

存储过程的参数也要对应起来:最终结果如下图:

好的,现在我们就把更新、删除、插入的存储过程与EDM的函数对应起来了。还有一个比较特殊的是就是选择的存储过程。

下面我们来映射SelectCategory存储过程。

在EDM设计器的空白处:右键--》Model Browser,打开Model 浏览窗口。如下图:

在SelectCategory上面右键->Add Function Import...如下图:

Function Import Name是引入后,在代码中使用时所用到的名字。然后返回值的集合,选择:实体(Category),如下图:然后点击OK

此时我们在Model Browser 中看到我们已经成功引用一个函数:如下图:

3. 下面我们来使用这个作了存储过程映射的EDM,在Form1上添加控件如下图:(因为在写代码的时候,都是通过访问其Name属性来找到该控件的。所以,我把文本框控件的显示文本初始化为其Name,这样既方便了自己编程,也方便了大家阅读代码。)

FillListbox 用于填充数据到listbox,click事件代码如下:

复制代码
1 private void button1_Click(object sender, EventArgs e)
2 {
3 using(var context = new NorthwindEntities())
4 {
5 //var categories = from c in context.Categories
6 // select new {c.CategoryID,c.CategoryName};
7
8 var categories = context.SelectCategory();
9
10 this.listBox1.DisplayMember = "CategoryName";
11 this.listBox1.ValueMember = "CategoryID";
12 this.listBox1.DataSource = categories;
13 }
14 }
复制代码
注意:上面注释掉的部分,是我们以前使用的方式。现在的context调用了一个方法:SelectCategory()。它就是刚才我们用selectCategory存储过程映射成的那个函数。SelectCategory()在调用的时候,最终是执行低层的selectCategory存储过程的。

添加功能。代码如下:

复制代码
1 private void btnInsert_Click(object sender, EventArgs e)
2 {
3 using (var context = new NorthwindEntities())
4 {
5 Category c = new Category();
6 c.CategoryName = this.tbCateNameNew.Text.ToString().Trim();
7 c.Description = this.tbCateDescNew.Text.ToString().Trim();
8
9 context.AddToCategories(c);
10 context.SaveChanges();
11 MessageBox.Show("succeed");
12 }
13 }
复制代码
更新功能,代码如下:

复制代码
1 private void btnUpdate_Click(object sender, EventArgs e)
2 {
3 int id =Convert.ToInt32(this.tbCateIDUpdate.Text);
4
5 using (var context = new NorthwindEntities())
6 {
7 var categories = context.Categories.First(c=>c.CategoryID == id);
8
9 categories.CategoryName = this.tbNameUpdate.Text.ToString().Trim();
10 categories.Description = this.tbDescUpdate.Text.ToString().Trim();
11 context.SaveChanges();
12 MessageBox.Show("succeed");
13 }
14 }
复制代码
删除功能,代码如下:

复制代码
1 private void btnDele_Click(object sender, EventArgs e)
2 {
3 int id = Convert.ToInt32(this.tbCateID.Text);
4
5 using (var context = new NorthwindEntities())
6 {
7 var categorie = context.Categories.First(c => c.CategoryID == id);
8 context.DeleteObject(categorie);
9
10 context.SaveChanges();
11 MessageBox.Show("succeed");
12 }
13 }
复制代码
从上面可以看到,使用了存储过程以后,我们作增删改的代码,并没有任何变化。只有选择有些变化。以前我们没有映射存储过程,所以LINQ语句最终是生成SQL脚本的。现在我们使用了存储过程以后,再执行上面这些代码时,最终都是映射成调用数据库的存储过程,而不再生成脚本了。如果有Data profile viewer的话,你可以监控观察数据库的执行情况,可惜我机器上没有,所以无法截图了。

存储过程在EF4中是当作函数来处理的。

可以打开EDM的xml的形式查看:和没有映射存储过程以前,发现有以下变化。

SSDL部分:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
复制代码
CSDL部分:

1
Mapping部分分两部分映射:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
复制代码

1
在概念层EF4并不直接和存储过程打交到。而是以函数的形式处理实体。这样更符合面向对象的编程形式。

存储过程结合EF4的使用,是很方面的。可以有人专门设计存储过程,而由其它人使用的时候,只是使用映射过后的函数。这样就更加直观。调用时也不必考虑底层存储过程的形式了。

好了,就到这了。晚安咯!!!

Entity Framework4.0 (七) EF4的存储过程的更多相关文章

  1. [转]Entity Framework4.0 (七) EF4的存储过程

    本文转自:http://www.cnblogs.com/marksun/archive/2011/12/21/2296500.html 前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单 ...

  2. Entity Framework4.0 (六) EF4的 增加、删除、更改

    前面介绍了EF4的查询功能,主要是借助于LINQ的强大的查询功能和它简单的语法.让我们可以完全面向对象集体去进行查询,而不必去劳心处理那些关系型数据库表的操作.这样我们更容易把主要精力集中在业务逻辑上 ...

  3. Entity Framework4.0 (一)概述(EF4 的Database First方法)

    转自:http://www.cnblogs.com/marksun/archive/2011/12/15/2289582.html Entity Framework4.0(以后简称:EF4),是Mic ...

  4. VS2010+Oracle11+Entity Framework4.1环境搭建及常见问题(转)

    一,开场白: 在微软的实体数据模型中存在四种查询方式:SQL字符串:Linq:Linq to SQL:Linq to Entity(ESQL) 对于Linq SQL目前微软虽然仍在支持,但微软已经声明 ...

  5. VS2010+Oracle11+Entity Framework4.1环境搭建及常见问题

    在微软的实体数据模型中存在四种查询方式: SQL字符串:Linq:Linq to SQL:Linq to Entity(ESQL) 对于Linq SQL目前微软虽然仍在支持,但微软已经声明不再推荐. ...

  6. Windows Server2008 下用于.NET Framework3.0版本的问题无法在IIS7中配置.NET Framework4.0节点的问题

    Windows Server 2008中,功能列表安装的为.NET Framework3.0. 试了N种方法未升级为.NET Framework4.0(哪位如果可以直接升级为4.0或3.5希望能够分享 ...

  7. 怎么解决xp系统不能安装NET Framework4.0?

    第一步: 如果是XP系统: 1.开始——运行——输入cmd——回车——在打开的窗口中输入net stop WuAuServ 2.开始——运行——输入%windir% 3.在打开的窗口中有个文件夹叫So ...

  8. Win7系统安装好Axure点击运行报.NET Framework4.0未安装的解决办法

      1:问题 由于工作需要,需要研究一下Axure原型设计软件的使用方式,在公司的电脑上成功安装了从同事那里拿来的Axure7.0软件,能够正确运行没有任何问题,在自己的电脑上安装的也非常顺利,不过运 ...

  9. 如何解决.NET Framework4.0的System.EnterpriseServices could not found 的问题

    我今天建基于.NET Framework4.0的webSite时报错 “System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, Pub ...

随机推荐

  1. Eclipse 中隐藏的 5 个非常有用的功能

    Eclipse就是一头野兽.它也是一套设备,神秘但更具威力.有些人称它为一个持续变形机.另一些人则称它是一个变异体.不错,它很庞大,需要花费多年才能掌握.而在你好不容易掌握之后,你的老板出现了然后告诉 ...

  2. 【go】脑补框架 Express beego tornado Flux reFlux React jsx jpg-ios出品

    http://goexpresstravel.com/ 今天 Express 的作者 TJ Holowaychuk 发了一篇文章,正式宣告和 Node.js 拜拜了,转向 Go 语言. Go vers ...

  3. sharepoint 2010 masterpage中必须的Content PlaceHolder

    Professional SharePoint 2010 Branding and Use

  4. Core love JavaScript

    Core love JavaScript 前言 在 ASP.NET 团队的 Github 的主页上,有这样一个开源项目叫:"JavaScriptsServices",那么什么是 J ...

  5. C++中头文件相互包含与前置声明

    一.类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题.假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中, ...

  6. NSFileHandle 和 NSFileManager的一些用法

    文件操作 NSFileManager 常见的NSFileManager文件的方法: -(BOOL)contentsAtPath:path 从文件中读取数据 -(BOOL)createFileAtPat ...

  7. http://www.linuxidc.com/Linux/2007-09/7399.htm

    http://www.linuxidc.com/Linux/2007-09/7399.htm

  8. JVM内存状况查看方法和分析工具

    Java本身提供了多种丰富的方法和工具来帮助开发人员查看和分析GC及JVM内存的状况,同时开源界和商业界也有一些工具可用于查看.分析GC及JVM内存的状况.通过这些分析,可以排查程序中内存泄露的问题及 ...

  9. Qt: 自动调整到最合适的大小(不是很明白)

    SortDialog::SortDialog(QWidget *parent) : QDialog(parent) { setupUi(this); groupBox_2->hide(); gr ...

  10. POJ2635——The Embarrassed Cryptographer(高精度取模+筛选取素数)

    The Embarrassed Cryptographer DescriptionThe young and very promising cryptographer Odd Even has imp ...