实体框架 - 命令拦截



在 Entity Framework 6.0 中,有一个新的功能称为拦截器或拦截。拦截代码围绕拦截接口的概念构建。例如,IDbCommandInterceptor 接口定义了在 EF 调用 ExecuteNonQuery、ExecuteScalar、ExecuteReader 和相关方法之前调用的方法。

  • 通过使用拦截,实体框架可以真正发挥其优势。使用这种方法,您可以捕获更多瞬态信息,而无需弄乱您的代码。

  • 要实现此功能,您需要创建自己的自定义拦截器并相应地注册它。

  • 一旦创建了实现 IDbCommandInterceptor 接口的类,就可以使用 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);
   }

}

注册拦截器

一旦创建了实现一个或多个拦截接口的类,就可以使用 DbInterception 类将其注册到 EF 中,如下面的代码所示。

DbInterception.Add(new MyCommandInterceptor());

还可以使用 DbConfiguration 基于代码的配置在应用程序域级别注册拦截器,如下面的代码所示。

public class MyDBConfiguration : DbConfiguration {

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

您还可以使用以下代码配置拦截器配置文件 -

<entityFramework>
   <interceptors>
      <interceptor type = "EFInterceptDemo.MyCommandInterceptor, EFInterceptDemo"/>
   </interceptors>
</entityFramework>
广告