在Entity Framework中使用存储过程的CUD操作
在前一章中,我们已经了解了如何使用存储过程读取数据。在本章中,当我们调用database-first方法中的SaveChanges()方法时,我们将使用存储过程对实体进行CUD(创建、更新、删除)操作。
我们将为Student实体使用以下存储过程:
1、sp_InsertStudentInfo:插入一个新的学生记录到数据库中
2、sp_UpdateStudent:更新学生记录
3、sp_DeleteStudent:删除数据库中的学生记录。
下面是每个存储过程的SQL脚本。
Sp_InsertStudentInfo:
CREATE PROCEDURE [dbo].[sp_InsertStudentInfo]
-- Add the parameters for the stored procedure here
@StandardId int = null,
@StudentName varchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO [SchoolDB].[dbo].[Student]([StudentName],[StandardId])
VALUES(@StudentName, @StandardId)
SELECT SCOPE_IDENTITY() AS StudentId
END
sp_UpdateStudent:
CREATE PROCEDURE [dbo].[sp_UpdateStudent]
-- Add the parameters for the stored procedure here
@StudentId int,
@StandardId int = null,
@StudentName varchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Update [SchoolDB].[dbo].[Student]
set StudentName = @StudentName,StandardId = @StandardId
where StudentID = @StudentId;
END
sp_DeleteStudent:
CREATE PROCEDURE [dbo].[sp_DeleteStudent]
-- Add the parameters for the stored procedure here
@StudentId int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DELETE FROM [dbo].[Student]
where StudentID = @StudentId
END
首先,需要更新现有的EDM,以便将这些存储过程添加到EDM中。右键单击你的设计器,然后Update Model from Database…打开更新向导。展开Stored Procedures and Functions节点,选择上述存储过程,并取消选中“Import selected stored procedures and function into the entity model”复选框,因为我们将直接将这些过程映射到Student实体。
单击Finish按钮。模型浏览器将在存储模型部分中显示过程,但不在函数导入中显示,如下所示。
您需要将这些存储过程映射到Student实体。在EDM设计器中,右键单击Student实体并Stored Procedure Mapping以打开映射详细信息,如下所示。
在映射详细信息中,如下所示,您将看到<Select Insert Function>, <Select Update Function>, and <Select Delete Function>。在下拉菜单中为每个存储过程选择合适的存储过程,例如sp_InsertStudentInfo用于插入函数,sp_UpdateStudent用于更新函数,sp_DeleteStudent用于删除函数。
sp_InsertStudentInfo返回studententid的值,并将其映射到Student实体的studententid,如下所示:
完成插入、更新和删除过程参数与Student实体的适当属性的映射,如下所示。
现在,我们需要在执行之前验证它,以确保不会出现运行时错误。要做到这一点,右键单击设计器中的Student实体,然后单击Validate,并确保没有警告或错误。
现在,每当您添加、更新或删除Student实体时,EF将使用这些存储过程进行CUD操作,而不是执行SQL命令。下面的例子说明了这一点:
using (var context = new SchoolDBEntities())
{
Student student = new Student() { StudentName = "New student using SP"};
context.Students.Add(student);
//will execute sp_InsertStudentInfo
context.SaveChanges();
student.StudentName = "Edit student using SP";
//will execute sp_UpdateStudent
context.SaveChanges();
context.Students.Remove(student);
//will execute sp_DeleteStudentInfo
context.SaveChanges();
}
上面的例子将在每次SaveChanges()调用上执行以下语句:
exec [dbo].[sp_InsertStudentInfo] @StandardId=NULL,@StudentName='New student using SP'
go
exec [dbo].[sp_UpdateStudent] @StudentId=47,@StandardId=NULL,@StudentName='Edit student using SP'
go
exec [dbo].[sp_DeleteStudent] @StudentId=47
go
注意:一旦它在添加一个新学生后执行SaveChanges方法,它会将一个数据库生成的值分配给StudentID属性。为了跟踪它并在该实体对象上执行进一步的操作,这是必要的。下图显示了Visual Studio调试视图中的值。
参考
https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/