Entity Framework - กระบวนงานที่จัดเก็บ

Entity Framework ช่วยให้คุณใช้โพรซีเดอร์ที่จัดเก็บไว้ใน Entity Data Model แทนหรือใช้ร่วมกับการสร้างคำสั่งอัตโนมัติ

  • คุณสามารถใช้กระบวนงานที่จัดเก็บเพื่อดำเนินการตรรกะที่กำหนดไว้ล่วงหน้าบนตารางฐานข้อมูลและหลายองค์กรมีนโยบายที่กำหนดให้ใช้กระบวนงานที่จัดเก็บเหล่านี้

  • นอกจากนี้ยังสามารถระบุว่า EF ควรใช้โพรซีเดอร์ที่จัดเก็บไว้ของคุณสำหรับการแทรกอัปเดตหรือลบเอนทิตี

  • แม้ว่าคำสั่งที่สร้างขึ้นแบบไดนามิกจะปลอดภัยมีประสิทธิภาพและโดยทั่วไปดีเท่ากับหรือดีกว่าคำสั่งที่คุณเขียนเอง แต่ก็มีหลายกรณีที่มีขั้นตอนการจัดเก็บอยู่แล้วและแนวปฏิบัติของ บริษัท ของคุณอาจ จำกัด การใช้ตารางโดยตรง

  • หรือคุณอาจต้องการควบคุมสิ่งที่ดำเนินการในร้านค้าอย่างชัดเจนและต้องการสร้างกระบวนงานที่จัดเก็บไว้

ตัวอย่างต่อไปนี้สร้างโปรเจ็กต์ใหม่จากไฟล์→ใหม่→โปรเจ็กต์

Step 1 - เลือกแอปพลิเคชันคอนโซลจากบานหน้าต่างตรงกลางและป้อน StoredProceduresDemo ในช่องชื่อ

Step 2 - ใน Server explorer คลิกขวาที่ฐานข้อมูลของคุณ

Step 3 - เลือกแบบสอบถามใหม่และป้อนรหัสต่อไปนี้ในตัวแก้ไข T-SQL เพื่อเพิ่มตารางใหม่ในฐานข้อมูลของคุณ

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 - คลิกขวาที่ตัวแก้ไขและเลือกดำเนินการ

Step 5- คลิกขวาที่ฐานข้อมูลของคุณแล้วคลิกรีเฟรช คุณจะเห็นตารางที่เพิ่มใหม่ในฐานข้อมูลของคุณ

Step 6 - ใน Server explorer ให้คลิกขวาที่ฐานข้อมูลของคุณอีกครั้ง

Step 7 - เลือกแบบสอบถามใหม่และป้อนรหัสต่อไปนี้ในตัวแก้ไข T-SQL เพื่อเพิ่มขั้นตอนการจัดเก็บในฐานข้อมูลของคุณซึ่งจะส่งคืนคะแนนของนักเรียน

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 - คลิกขวาที่ตัวแก้ไขและเลือกดำเนินการ

Step 9- คลิกขวาที่ฐานข้อมูลของคุณแล้วคลิกรีเฟรช คุณจะเห็นว่ามีการสร้างกระบวนงานที่จัดเก็บไว้ในฐานข้อมูลของคุณ

Step 10 - คลิกขวาที่ชื่อโครงการใน Solution Explorer แล้วเลือกเพิ่ม→รายการใหม่

Step 11 - จากนั้นเลือก ADO.NET Entity Data Model ในบานหน้าต่างเทมเพลต

Step 12 - ป้อน SPModel เป็นชื่อจากนั้นคลิกเพิ่ม

Step 13 - ในกล่องโต้ตอบเลือกเนื้อหาแบบจำลองให้เลือกตัวออกแบบ EF จากฐานข้อมูลจากนั้นคลิกถัดไป

Step 14 - เลือกฐานข้อมูลของคุณแล้วคลิกถัดไป

Step 15 - ในกล่องโต้ตอบเลือกวัตถุฐานข้อมูลของคุณให้คลิกที่ตารางมุมมอง

Step 16 - เลือกฟังก์ชัน GetStudentGradesForCourse ที่อยู่ภายใต้โหนด Stored Procedures and Functions แล้วคลิก Finish

Step 17 - เลือก View → Other Windows → Entity Data Model Browser แล้วคลิกขวา GetStudentGrades ภายใต้ Function Imports แล้วเลือก Edit

มันจะสร้างกล่องโต้ตอบต่อไปนี้

Step 18 - คลิกที่ปุ่มตัวเลือกเอนทิตีและเลือก StudentGrade จากคอมโบบ็อกซ์เป็นประเภทการส่งคืนของกระบวนงานที่เก็บไว้นี้และคลิกตกลง

มาดูรหัส C # ต่อไปนี้ซึ่งจะมีการดึงคะแนนทั้งหมดโดยส่งรหัสนักเรียนเป็นพารามิเตอร์ในขั้นตอนการจัดเก็บ 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();

      }
   }
}

เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะได้รับผลลัพธ์ต่อไปนี้ -

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

เราขอแนะนำให้คุณดำเนินการตามตัวอย่างข้างต้นในลักษณะทีละขั้นตอนเพื่อความเข้าใจที่ดีขึ้น