在 ADO.NET Entity Framework 中使用存储过程

作者: 诸剑俊

时间: 2008年12月6日

 

摘要

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

建立示例数据库

数据库脚本:

CodeSET 

ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[Group]
(
    [GroupID] [int] IDENTITY(1,1) NOT NULL,
    [GroupName] [nvarchar](20) NOT NULL, CONSTRAINT 
[PK_Group] PRIMARY KEY CLUSTERED
 (
    [GroupID] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON
)
 ON [PRIMARY]) ON [PRIMARY]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[User]
(
    [UserID] [int] IDENTITY(1,1) NOT NULL,    [UserName] [nvarchar](20) NOT NULL,
    [UserGroupID] [int] NOT NULL, CONSTRAINT
 [PK_User] PRIMARY KEY CLUSTERED 
(
    [UserID] ASC
)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF,
 IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON
 [PRIMARY]GOALTER TABLE [dbo].[User] 
 WITH CHECK ADD  CONSTRAINT
 [FK_User_Group] FOREIGN KEY([UserGroupID])
REFERENCES [dbo].[Group]
 ([GroupID])GOALTER TABLE
 [dbo].[User] CHECK CONSTRAINT [FK_User_Group]
GOcreate procedure CreateUser@username nvarchar(20),
@groupid intasbegininsert into [User]
 ([UserName] ,
[UserGroupID] )

 values(@username,@groupid)endgocreate procedure DeleteUser@userid int,@groupid intasbegindelete from [User] where
 UserID=@useridendgocreate procedure UpdateUser@userid int,@username nvarchar(20),@groupid intasbeginupdate [User] set [UserName] =@username ,[UserGroupID] =@groupid where [UserID] =@userid endgocreate procedure GetUserInfo@userid intasbeginselect [UserID],[UserName],[UserGroupID] from [User] where [UserID] =@userid endgoinsert into [Group] ([GroupName] )

 values('管理员')insert into [Group] ([GroupName] )

 values('注册用户')insert into [Group] ([GroupName] )

 values('游客')

它将建立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();

(示例下载: http://files.cnblogs.com/Snowdreams/StoredProcedureDemo.rar)

 


 

 

下一篇:ASPNET MVC页面返回不同类型的内容-诸剑俊