Entity Framework có khả năng tự động xây dựng những lệnh riêng cho CSDL dựa trên những truy vấn LINQ to Entities hoặc Entity SQL của bạn cũng như xây dựng những câu lệnh cho việc thêm, chỉnh sửa hoặc xóa dữ liệu. Bạn có thể muốn ghi đè những bước này và sử dụng những stored procedure riêng của bạn. Bạn có thể sử dụng stored procedures để lấy dữ liệu hoặc add/update/delete những record vào một hoặc nhiều bảng CSDL.

Stored procedures và user-defined functions (UDFs) trong CSDL được trình bày như những hàm trong Entity Framework. EDM sẽ không có bất kỳ thực thể nào cho stored procedures trong EDM designer.

Ở đây chúng ta sẽ thêm stored procedure sau GetCoursesByStudentId vào EDM. Procedure này trả về tất cả các khóa học được gán tới một sinh viên riêng biệt:

CREATE PROCEDURE [dbo].[GetCoursesByStudentId]
    -- Add the parameters for the stored procedure here
    @StudentId int = null
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
select c.courseid, c.coursename,c.Location, c.TeacherId
from student s 
left outer join studentcourse sc on sc.studentid = s.studentid 
left outer join course c on c.courseid = sc.courseid
where s.studentid = @StudentId
END

Đầu tiên tạo một ADO.Net Entity Data Model mới sử dụng EF Designer from database.

Entity Framework stored procedure

Chọn GetCoursesByStudentId. Chắc chắn rằng Import selected stored procedures and functions into the entity model checkbox được chọn và click Finish.

Entity Framework stored procedure

Bạn sẽ thấy GetCoursesByStudentId được thêm trong Function Imports với complex type mới GetCoursesByStudentId_Result trong Model Browser. Bất cứ khi nào bạn import một stored procedure vào một model, nó sẽ tạo một complex type mới với tên {sp name}_Result theo mặc định.

Entity Framework stored procedure

GetCoursesByStudentId trả về những trường giống nhau được định nghĩa trong thực thể Course. Vì vậy chúng ta không cần thêm một complex type mới cho dữ liệu trả về từ GetCoursesByStudentId. Bạn có thể thay đổi nó bằng cách click chuột phải vào GetCoursesByStudentId trong function imports và chọn Edit. Kiểm tra Entities và chọn Course từ dropdown trong cửa sốpopup như bên dưới:

Entity Framework stored procedure
Entity Framework stored procedure

Bạn sẽ nhìn thấy hàm trong lớp context cho GetCoursesByStudentId như bên dưới:

Entity Framework stored procedure

Giờ GetCoursesByStudentId có thể được gọi và kết quả như bên dưới sẽ trả về:

using (var context = new SchoolDBEntities())
{
    var courses = context.GetCoursesByStudentId(1);

    foreach (Course cs in courses)
        Console.WriteLine(cs.CourseName);
}

The code shown above will execute the following statement: Đoạn mã trên đây sẽ thực thi những lệnh sau:

exec [dbo].[GetCoursesByStudentId] @StudentId=1

CRUD sử dụng Stored Procedure:

Ở mục này chúng ta sẽ sử dụng stored procedures cho thao tác CUD (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

Note: 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

Nguồn: http://www.entityframeworktutorial.net/

Advertisements