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);
}
}
เราขอแนะนำให้คุณดำเนินการตามตัวอย่างข้างต้นในลักษณะทีละขั้นตอนเพื่อความเข้าใจที่ดีขึ้น