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);
   }
}

Мы рекомендуем вам выполнить приведенный выше пример поэтапно для лучшего понимания.