Khung thực thể - Ghi nhật ký lệnh
Trong Entity Framework 6.0, một tính năng mới được giới thiệu được gọi là Logging SQL. Trong khi làm việc với Entity Framework, nó sẽ gửi các lệnh hoặc một truy vấn SQL tương đương đến cơ sở dữ liệu để thực hiện các hoạt động CRUD (Tạo, Đọc, Cập nhật và Xóa).
Tính năng này của Entity Framework là nắm bắt một truy vấn SQL tương đương do Entity Framework tạo trong nội bộ và cung cấp nó dưới dạng đầu ra.
Trước Entity Framework 6, bất cứ khi nào có nhu cầu theo dõi các truy vấn và lệnh cơ sở dữ liệu, nhà phát triển không có lựa chọn nào khác ngoài việc sử dụng một số tiện ích theo dõi bên thứ ba hoặc công cụ truy tìm cơ sở dữ liệu.
Trong Entity Framework 6, tính năng mới này cung cấp một cách đơn giản bằng cách ghi lại tất cả các hoạt động được thực hiện bởi Entity Framework.
Tất cả các hoạt động được thực hiện bởi Entity Framework đều được ghi lại bằng DbContext.Database.Log.
Hãy xem đoạn mã sau, trong đó một sinh viên mới được thêm vào cơ sở dữ liệu.
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();
}
}
}
Khi đoạn mã trên được thực thi, bạn sẽ nhận được kết quả sau, đây thực sự là nhật ký của tất cả các hoạt động được thực hiện bởi EF trong đoạn mã trên.
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
Khi thuộc tính Nhật ký được đặt, các hoạt động sau được ghi lại:
SQL cho tất cả các loại lệnh khác nhau, ví dụ như Truy vấn, bao gồm chèn, cập nhật và xóa được tạo như một phần của SaveChanges
Parameters
Lệnh có đang được thực thi không đồng bộ hay không
Dấu thời gian cho biết thời điểm lệnh bắt đầu thực thi
Lệnh đã hoàn thành thành công hay không thành công
Một số dấu hiệu của giá trị kết quả
Khoảng thời gian cần thiết để thực hiện lệnh
Đăng nhập đến nơi khác
Nếu bạn đã có một số khung ghi nhật ký và nó xác định phương pháp ghi thì bạn cũng có thể ghi nó vào nơi khác.
Hãy xem ví dụ sau, trong đó chúng ta có một lớp MyLogger khác.
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);
}
}
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.