Учебники

Entity Framework — Перехват команд

В Entity Framework 6.0 есть еще одна новая функция, известная как Перехватчик или Перехват. Код перехвата построен вокруг концепции интерфейсов перехвата . Например, интерфейс IDbCommandInterceptor определяет методы, которые вызываются до того, как EF вызовет ExecuteNonQuery, ExecuteScalar, ExecuteReader и связанные методы.

  • Entity Framework может действительно сиять, используя перехват. Используя этот подход, вы можете временно собрать гораздо больше информации без необходимости распутывать ваш код.

  • Чтобы реализовать это, вам нужно создать свой собственный перехватчик и зарегистрировать его соответствующим образом.

  • После создания класса, реализующего интерфейс IDbCommandInterceptor, его можно зарегистрировать в Entity Framework с помощью класса DbInterception.

  • Интерфейс IDbCommandInterceptor имеет шесть методов, и вам необходимо реализовать все эти методы. Ниже приведены основные реализации этих методов.

Entity Framework может действительно сиять, используя перехват. Используя этот подход, вы можете временно собрать гораздо больше информации без необходимости распутывать ваш код.

Чтобы реализовать это, вам нужно создать свой собственный перехватчик и зарегистрировать его соответствующим образом.

После создания класса, реализующего интерфейс IDbCommandInterceptor, его можно зарегистрировать в Entity Framework с помощью класса DbInterception.

Интерфейс IDbCommandInterceptor имеет шесть методов, и вам необходимо реализовать все эти методы. Ниже приведены основные реализации этих методов.

Давайте посмотрим на следующий код, в котором реализован интерфейс IDbCommandInterceptor.

public class MyCommandInterceptor : IDbCommandInterceptor {

   public static void Log(string comm, string message) {
      Console.WriteLine("Intercepted: {0}, Command Text: {1} ", comm, message);
   }

   public void NonQueryExecuted(DbCommand command, 
      DbCommandInterceptionContext<int> interceptionContext) {
         Log("NonQueryExecuted: ", command.CommandText);
   }

   public void NonQueryExecuting(DbCommand command, 
      DbCommandInterceptionContext<int> interceptionContext) {
         Log("NonQueryExecuting: ", command.CommandText);
   }

   public void ReaderExecuted(DbCommand command, 
      DbCommandInterceptionContext<DbDataReader> interceptionContext) {
         Log("ReaderExecuted: ", command.CommandText);
   }

   public void ReaderExecuting(DbCommand command, 
      DbCommandInterceptionContext<DbDataReader> interceptionContext) {
         Log("ReaderExecuting: ", command.CommandText);
   }

   public void ScalarExecuted(DbCommand command, 
      DbCommandInterceptionContext<object> interceptionContext) {
         Log("ScalarExecuted: ", command.CommandText);
   }

   public void ScalarExecuting(DbCommand command, 
      DbCommandInterceptionContext<object> interceptionContext) {
         Log("ScalarExecuting: ", command.CommandText);
   }

}

Регистрация перехватчиков

Как только класс, который реализует один или несколько интерфейсов перехвата, создан, он может быть зарегистрирован в EF с использованием класса DbInterception, как показано в следующем коде.

DbInterception.Add(new MyCommandInterceptor());

Перехватчики также могут быть зарегистрированы на уровне домена приложения, используя конфигурацию на основе кода DbConfiguration, как показано в следующем коде.

public class MyDBConfiguration : DbConfiguration {

   public MyDBConfiguration() {
      DbInterception.Add(new MyCommandInterceptor());
   }
}

Вы также можете настроить файл конфигурации перехватчика с помощью кода —