EF 6 DB-First系列--在Entity Framework中使用存储过程的CUD操作

在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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值