Учебники

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.

Эта особенность 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

  • параметры

  • Является ли команда выполняется асинхронно

  • Отметка времени, указывающая, когда команда начала выполняться

  • Команда выполнена успешно или не выполнена

  • Некоторое указание значения результата

  • Примерное количество времени, необходимое для выполнения команды

SQL для всех видов команд, например, запросов, включая вставки, обновления и удаления, созданные как часть SaveChanges

параметры

Является ли команда выполняется асинхронно

Отметка времени, указывающая, когда команда начала выполняться

Команда выполнена успешно или не выполнена

Некоторое указание значения результата

Примерное количество времени, необходимое для выполнения команды

Вход в другое место

Если у вас уже есть какая-то структура ведения журнала, и она определяет метод ведения журнала, вы также можете записать ее в другое место.

Давайте посмотрим на следующий пример, в котором у нас есть другой класс 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);
   }
}

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