摘要
本文主要介绍在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)