EF 6 - CRUD trong Stored Procedure

 CRUD sử dụng Stored Procedure:

Ở mục này chúng ta sẽ sử dụng stored procedures cho thao tác CRUD (create, update, delete) sử dụng DbContext. Có nghĩa rằng context sẽ thực thi những stored procedure thay vì những lệnh DDL trên context.SaveChanges().

Chúng ta sẽ sử dụng những stored procedure sau:

  1. sp_InsertStudentInfo để thêm một sinh viên mới vào CSDL.
  2. sp_UpdateStudent để cập nhật sinh viên.
  3. sp_DeleteStudent để xóa một sinh viên trong CSDL.

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

Đầu tiên thêm những stored procedure này vào EDM và chắc chắn rằng Import selected stored procedures and function into the entity model checkbox là unchecked vì chúng ta sẽ nối những procedure này với thực thể Student trực tiếp.

Entity Framework stored procedure

Trong Model Browser sẽ thêm những procedure vào Storage model mà không phải trong Function Imports.

Entity Framework stored procedure

Ở EDM designer, click chuột phải vào thực thể Student và chọn Stored Procedure Mapping để mở Mapping details:

Entity Framework stored procedure

Trong Mapping Details, bạn sẽ thấy <Select Insert Function>, <Select Update Function> và <Select Delete Function>. Chọn stored procedure phù hợp cho mỗi cái. Vd: Chọn sp_InsertStudentInfo cho hàm Insert như bên dưới:

Entity Framework stored procedure

sp_InsertStudentInfo trả về StudentId mới khởi tạo. Nối cái này với StudentID của thực thể Student như bên dưới:

Entity Framework stored procedure

Hoàn thành việc nối những procedure Insert, Update và Delete như bên dưới:

Entity Framework stored procedure

Giờ chúng ta cần kiểm tra nó trước khi thực thi để đảm bảo rằng sẽ không có lỗi ở thời gian thực thi. Để thực hiện việc này, click chuột phải vào thực thể Student trong phần thiết kế và click Validate và chắc chắn rằng không có cảnh báo hoặc lỗi nào:

Entity Framework stored procedure

Bạn có thể thêm, cập nhật và xóa sinh viên như bên dưới:

using (var context = new SchoolDBEntities())
{
    Student newStudent = new Student() { StudentName = "New Student using SP"};

    context.Students.Add(newStudent);
    //will execute sp_InsertStudentInfo 
    context.SaveChanges();

    newStudent.StudentName = "Edited student using SP";
    //will execute sp_UpdateStudent
    context.SaveChanges();

    context.Students.Remove(newStudent);
    //will execute sp_DeleteStudentInfo 
    context.SaveChanges();
}

Đoạn mã trên sẽ thực thi những stored procedure sau trên mỗi SaveChanges():

exec [dbo].[sp_InsertStudentInfo] @StandardId=NULL,@StudentName='New Student using SP'
go

exec [dbo].[sp_UpdateStudent] @StudentId=47,@StandardId=NULL,@StudentName='Edited student using SP'
go

exec [dbo].[sp_DeleteStudent] @StudentId=47
go

 

Lưu ý: Một khi context gọi SaveChanges sau khi thêm một sinh viên mới, nó sẽ gán StudentID mới vào thuộc tính StudentID của thực thể Student bởi vì sp_InsertStudentInfo trả về StudentId. Điều này là cần thiết để sử dụng đối tượng thực thể đó cho những thao tác xa hơn.

 

Entity Framework stored procedure