Khung thực thể - Thủ tục được lưu trữ

Khung thực thể cho phép bạn sử dụng các thủ tục được lưu trữ trong Mô hình dữ liệu thực thể thay vì hoặc kết hợp với việc tạo lệnh tự động của nó.

  • Bạn có thể sử dụng các thủ tục được lưu trữ để thực hiện logic được xác định trước trên các bảng cơ sở dữ liệu và nhiều tổ chức có các chính sách yêu cầu sử dụng các thủ tục được lưu trữ này.

  • Nó cũng có thể chỉ định rằng EF nên sử dụng các thủ tục được lưu trữ của bạn để chèn, cập nhật hoặc xóa các thực thể.

  • Mặc dù các lệnh được xây dựng động là an toàn, hiệu quả và nói chung là tốt hoặc tốt hơn các lệnh bạn có thể tự viết, nhưng có nhiều trường hợp các thủ tục được lưu trữ đã tồn tại và các thông lệ của công ty bạn có thể hạn chế sử dụng trực tiếp các bảng.

  • Ngoài ra, bạn có thể chỉ muốn có quyền kiểm soát rõ ràng đối với những gì được thực thi trên cửa hàng và muốn tạo các thủ tục được lưu trữ.

Ví dụ sau tạo một dự án mới từ Tệp → Mới → Dự án.

Step 1 - Chọn Ứng dụng bảng điều khiển từ ngăn giữa và nhập StoredProceduresDemo vào trường tên.

Step 2 - Trong Trình thám hiểm máy chủ, nhấp chuột phải vào cơ sở dữ liệu của bạn.

Step 3 - Chọn Truy vấn Mới và nhập mã sau vào trình soạn thảo T-SQL để thêm một bảng mới vào cơ sở dữ liệu của bạn.

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = 
   OBJECT_ID(N'[dbo].[StudentGrade]') AND type in (N'U'))

BEGIN

   CREATE TABLE [dbo].[StudentGrade](

      [EnrollmentID] [int] IDENTITY(1,1) NOT NULL,
      [CourseID] [int] NOT NULL,
      [StudentID] [int] NOT NULL,
      [Grade] [decimal](3, 2) NULL,

      CONSTRAINT [PK_StudentGrade] PRIMARY KEY CLUSTERED (
         [EnrollmentID] ASC
      )

      WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

   ) ON [PRIMARY]

END
GO

Step 4 - Nhấp chuột phải vào trình soạn thảo và chọn Execute.

Step 5- Nhấp chuột phải vào cơ sở dữ liệu của bạn và nhấp vào làm mới. Bạn sẽ thấy bảng mới được thêm vào cơ sở dữ liệu của mình.

Step 6 - Trong Trình khám phá máy chủ, nhấp chuột phải vào cơ sở dữ liệu của bạn một lần nữa.

Step 7 - Chọn Truy vấn Mới và nhập mã sau vào trình soạn thảo T-SQL để thêm một thủ tục được lưu trữ trong cơ sở dữ liệu của bạn, thủ tục này sẽ trả về điểm của Học sinh.

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = 
   OBJECT_ID(N'[dbo].[GetStudentGrades]') AND type in (N'P', N'PC'))

BEGIN

   EXEC dbo.sp_executesql @statement = N'
   CREATE PROCEDURE [dbo].[GetStudentGrades]
   @StudentID int
   AS
   SELECT EnrollmentID, Grade, CourseID, StudentID FROM dbo.StudentGrade 
   WHERE StudentID = @StudentID
   '
END
GO

Step 8 - Nhấp chuột phải vào trình soạn thảo và chọn Execute.

Step 9- Nhấp chuột phải vào cơ sở dữ liệu của bạn và nhấp vào làm mới. Bạn sẽ thấy rằng một thủ tục được lưu trữ được tạo trong cơ sở dữ liệu của bạn.

Step 10 - Nhấp chuột phải vào tên dự án trong Solution Explorer và chọn Add → New Item.

Step 11 - Sau đó chọn ADO.NET Entity Data Model trong khung Templates.

Step 12 - Nhập SPModel làm tên, sau đó nhấp vào Thêm.

Step 13 - Trong hộp thoại Chọn Nội dung Mô hình, chọn trình thiết kế EF từ cơ sở dữ liệu, rồi bấm Tiếp theo.

Step 14 - Chọn cơ sở dữ liệu của bạn và nhấp vào Tiếp theo.

Step 15 - Trong hộp thoại Chọn Đối tượng Cơ sở dữ liệu của Bạn, bấm vào các bảng, dạng xem.

Step 16 - Chọn chức năng GetStudentGradesForCourse nằm dưới nút Thủ tục và Chức năng đã Lưu trữ và nhấp vào Kết thúc.

Step 17 - Chọn Chế độ xem → Windows khác → Trình duyệt mô hình dữ liệu thực thể và nhấp chuột phải vào GetStudentGrades trong Nhập chức năng và chọn Chỉnh sửa.

Nó sẽ tạo ra hộp thoại sau.

Step 18 - Nhấp vào nút radio Entities và chọn StudentGrade từ hộp kết hợp làm loại trả lại của thủ tục được lưu trữ này và nhấp vào Ok.

Chúng ta hãy xem đoạn mã C # sau, trong đó tất cả các điểm sẽ được truy xuất bằng cách chuyển ID sinh viên làm tham số trong thủ tục được lưu trữ GetStudentGrades.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         int studentID = 22;
         var studentGrades = context.GetStudentGrades(studentID);

         foreach (var student in studentGrades) {
            Console.WriteLine("Course ID: {0}, Title: {1}, Grade: {2} ", 
               student.CourseID, student.Course.Title, student.Grade);
         }

         Console.ReadKey();

      }
   }
}

Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau:

Course ID: 4022, Title: Microeconomics, Grade: 3.00
Course ID: 4041, Title: Macroeconomics, Grade: 3.50

Chúng tôi khuyên bạn nên thực hiện ví dụ trên theo cách từng bước để hiểu rõ hơn.