EF 6 - Stored Procedure

Stored Procedure trong EF 6

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);
}

 Đoạn mã trên đây sẽ thực thi những lệnh sau:

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