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
Когда свойство журнала установлено, регистрируются следующие действия:
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);
}
}
Мы рекомендуем вам выполнить приведенный выше пример поэтапно для лучшего понимания.