Entity Framework - การบันทึกคำสั่ง

ใน Entity Framework 6.0 มีการแนะนำคุณลักษณะใหม่ซึ่งเรียกว่า Logging SQL. ในขณะที่ทำงานกับ Entity Framework จะส่งคำสั่งหรือแบบสอบถาม SQL ที่เทียบเท่าไปยังฐานข้อมูลเพื่อดำเนินการ CRUD (สร้างอ่านอัปเดตและลบ)

  • คุณลักษณะนี้ของ Entity Framework คือการรวบรวมแบบสอบถาม SQL ที่เทียบเท่าซึ่งสร้างโดย Entity Framework ภายในและจัดให้เป็นผลลัพธ์

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

  • ใน Entity Framework 6 คุณลักษณะใหม่นี้มีวิธีง่ายๆโดยการบันทึกการดำเนินการทั้งหมดที่ดำเนินการโดย Entity Framework

  • กิจกรรมทั้งหมดที่ดำเนินการโดย Entity Framework จะถูกบันทึกโดยใช้ DbContext.Database.Log

มาดูรหัสต่อไปนี้ที่มีการเพิ่มนักเรียนใหม่ลงในฐานข้อมูล

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         context.Database.Log = Console.Write;

         // Create a new student and save it

         context.Students.Add(new Student {
            FirstMidName = "Salman", 
            LastName = "Khan", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         });

         context.SaveChanges();
         Console.ReadKey();
      }
   }
}

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

Opened connection at 10/28/2015 6:27:35 PM +05:00
Started transaction at 10/28/2015 6:27:35 PM +05:00
INSERT [dbo].[Student]([LastName], [FirstMidName], [EnrollmentDate])
VALUES (@0, @1, @2)
SELECT [ID]
FROM [dbo].[Student]
WHERE @@ROWCOUNT > 0 AND [ID] = scope_identity()
-- @0: 'Khan' (Type = String, Size = -1)
-- @1: 'Salman' (Type = String, Size = -1)
-- @2: '10/28/2015 12:00:00 AM' (Type = DateTime)
-- Executing at 10/28/2015 6:27:35 PM +05:00
-- Completed in 5 ms with result: SqlDataReader
Committed transaction at 10/28/2015 6:27:35 PM +05:00
Closed connection at 10/28/2015 6:27:35 PM +05:00

เมื่อคุณสมบัติ Log ถูกตั้งค่ากิจกรรมต่อไปนี้จะถูกบันทึก -

  • SQL สำหรับคำสั่งประเภทต่างๆเช่นแบบสอบถามรวมถึงการแทรกการอัปเดตและการลบที่สร้างขึ้นโดยเป็นส่วนหนึ่งของ SaveChanges

  • Parameters

  • ไม่ว่าคำสั่งจะถูกเรียกใช้แบบอะซิงโครนัสหรือไม่

  • การประทับเวลาที่ระบุเมื่อคำสั่งเริ่มดำเนินการ

  • คำสั่งเสร็จสมบูรณ์หรือล้มเหลว

  • การบ่งชี้บางประการของค่าผลลัพธ์

  • ระยะเวลาโดยประมาณที่ใช้ในการดำเนินการคำสั่ง

เข้าสู่สถานที่อื่น

หากคุณมีเฟรมเวิร์กการบันทึกอยู่แล้วและกำหนดวิธีการบันทึกคุณสามารถบันทึกไปยังที่อื่นได้

ลองดูตัวอย่างต่อไปนี้ซึ่งเรามี MyLogger คลาสอื่น

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         context.Database.Log = s ⇒ MyLogger.Log("EFLoggingDemo", s);

         // Create a new student and save it

         context.Students.Add(new Student {
            FirstMidName = "Salman", 
            LastName = "Khan", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         });

         context.SaveChanges();
         Console.ReadKey();
      }
   }
}

public class MyLogger {

   public static void Log(string application, string message) {
      Console.WriteLine("Application: {0}, EF Message: {1} ",application, message);
   }
}

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