摘要
本文主要介绍在ADO.NET Entity Framework中使用存储过程来进行查询、插入、更新、删除操作。
建立示例数据库
数据库脚本:
Code
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE 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]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE 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]
GO
ALTER TABLE [dbo].[User] WITH CHECK ADD CONSTRAINT [FK_User_Group] FOREIGN KEY([UserGroupID])
REFERENCES [dbo].[Group] ([GroupID])
GO
ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_User_Group]
GO
create procedure CreateUser
@username nvarchar(20),
@groupid int
as
begin
insert into [User] ([UserName] ,[UserGroupID] ) values(@username,@groupid)
end
go
create procedure DeleteUser
@userid int,
@groupid int
as
begin
delete from [User] where UserID=@userid
end
go
create procedure UpdateUser
@userid int,
@username nvarchar(20),
@groupid int
as
begin
update [User] set [UserName] =@username ,[UserGroupID] =@groupid where [UserID] =@userid
end
go
create procedure GetUserInfo
@userid int
as
begin
select [UserID],[UserName],[UserGroupID] from [User] where [UserID] =@userid
end
go
insert 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();
Demo下载
点击下载
本文适用于 Microsoft .NET Framework 3.5 SP1