随笔 - 35  文章 - 0  评论 - 208 

摘要

本文主要介绍在ADO.NET Entity Framework中使用存储过程来进行查询、插入、更新、删除操作。

建立示例数据库

数据库脚本:

 

Code

它将建立2个有外键关系的数据表和4个存储过程,分别为查询、插入、更新、删除。

设置实体数据模型

在项目中加入一个ADO.NET Entity Data Model文件,选择从数据库生成模型,在选择数据库对象时要钩上表和存储过程,这样就完成了实体数据模型的生成。

但是如果此时你用ADO.NET Framework对数据进行CRUD操作并不会使用存储过程,我们需要将存储过程进行映射。查询和另外三项操作的映射方式不同,我们分开讨论。
先说查询存储过程的导入。在模型浏览器中右键点击函数导入,选择创建函数导入。

在弹出的对话框中设置选择一个用于查询的存储过程名称,设置以后用于调用该方法的函数名称,并设置该方法的返回类型。

点击确定完成设置,此时在模型浏览器的函数导入处会多了一个函数,以后即可通过该函数调用此存储过程进行数据查询。
接下来说插入、更新、删除存储过程的影射。
这三个存储过程需要同时映射到实体类上,也就是说如果你为一个实体类的插入方法映射了存储过程,那么更新和删除也必须映射存储过程。
我们的这3个存储过程都是对User表进行操作,所以选中UserInfo实体类,在映射详细信息的将实体映射到函数选项卡进行设置。

分别在选择插入/更新/删除函数的地方选择对应的存储过程名,然后设置属性的映射。一般的存储过程参数会自动设置好映射,但是外键列需要手动设置。
Delete存储过程中的groupid是一个没有用的参数,加上这个参数的原因是在插入和更新操作中都涉及到了2个实体类,如果删除函数中没有映射Group这个导航属性会报2048错误。
现在,CRUD的存储过程都已经映射好了。

调用存储过程

插入/更新/删除操作只需要像平时一样使用AddToUserInfos/更新实体类并SaveChanges/DeleteObject这些方法就可以了。查询需要显式调用。

1 Entities db = new Entities();
2 UserInfo u = db.GetUserInfo(userid).FirstOrDefault();

 

Demo下载

点击下载

 

本文适用于 Microsoft .NET Framework 3.5 SP1


 

0
0
(请您对文章做出评价)
« 上一篇:Visual Studio 2008 安装 SP1 后智能提示变英语的修补程序 (KB957507)
» 下一篇:从Oxite看使用了ADO.NET Entity Framework的应用程序的多层架构
posted on 2008-12-06 00:32 Snowdream 阅读(5173) 评论(15)  编辑 收藏 网摘 所属分类: .NET Framework

  回复  引用  查看    
#1楼 2008-12-06 01:14 | 小兴      
看来博主也在研究EF啊,如果有兴趣的话可以一起讨论讨论,或者说赐教一下,我初学EF,看msdn的概念看的头大,很想了解一下EF框架...

  回复  引用  查看    
#2楼[楼主] 2008-12-06 01:42 | Snowdream      
@小兴
呵呵~我也正在研究中~:)

  回复  引用    
#3楼 2008-12-06 11:58 | kuku-zhang[未注册用户]
楼主你这个页面背景看的很吃力..哈哈
  回复  引用  查看    
#4楼 2008-12-06 12:38 | 风海迷沙      
总觉得Entity F用着有点不对劲,也说不清楚是哪里不对,好像不如linq to sql顺手,好像一下子又回到data access的时代去了。
  回复  引用  查看    
#5楼[楼主] 2008-12-06 13:03 | Snowdream      
@kuku-zhang
那我再把背景图案的颜色调淡一点~

@风海迷沙
第一个版本的东西要实际使用还是有不少麻烦的~呵呵~

  回复  引用    
#6楼 2008-12-06 13:34 | Javafun[未注册用户]
@Snowdream
握手,前一段我也发现了这个问题,经过最后的研究发现原来是因为EF太过于庞大和复杂,所以对于目前来说我感觉十分蹩手

  回复  引用  查看    
#7楼 2008-12-07 01:44 | Apple Yang      
谢谢楼主,长见识了
  回复  引用    
#8楼 2008-12-07 12:19 | 小小草[未注册用户]
谢谢楼主。。。。学习中!
  回复  引用  查看    
#9楼[楼主] 2008-12-07 15:22 | Snowdream      
@Apple Yang
@小小草
谢谢支持~

  回复  引用  查看    
#10楼 2009-03-25 11:34 | xcccb      
我想问一下.如果我的存储过程就一句select * from 视图
这样的话..我要返回什么类型呢..在程序上如何进行调用,让它返回的是一个IQueryTable 或是一个dataset 让它跟gridview进行绑定显示

谢谢

  回复  引用  查看    
#11楼[楼主] 2009-03-25 14:17 | Snowdream      
@xcccb
调用的方法就是这个函数的名字~一般也就是这个存储过程的名称~
返回的数据类型应该是一个 Entity 吧~如果这个视图中的各个字段影射到不同的表上~可以试试将返回类型设置为其中一个表的实体类型~其他几个属性应该会有外键关系~可以用导航属性访问到~

  回复  引用  查看    
#12楼 2009-03-30 09:26 | xcccb      
嗯..我用以下的方法可以用.

public IEnumerable<视图实体> get_list(testEntities testcontext,参数值)
{
try{
DbCommand cmd = testcontext.CreateStoreCommand("存储过程名",CommandType.StoreProcedure,new SqlParameter("@参数名",参数值);
var result = cmd.Materialize<视图实体>().Bind(testcontext);
return result;
}
catch
{
return null;
}
}

  回复  引用    
#13楼 2009-03-30 15:06 | sqlmx[未注册用户]
study
  回复  引用  查看    
#14楼 2009-09-11 18:00 | 上山打老虎      
怎么保存住存储过程的影射啊

比如说我从数据库更新了模型。

这些方法就又都没有了。

  回复  引用  查看    
#15楼[楼主] 2009-09-11 19:11 | Snowdream      
如果不修改存储过程的名称~存储过程映射不会消失的呀~