Entity Framework - Befehlsabfangen

In Entity Framework 6.0 gibt es eine weitere neue Funktion namens Interceptoroder Abfangen. Der Interception-Code basiert auf dem Konzept voninterception interfaces. Beispielsweise definiert die IDbCommandInterceptor-Schnittstelle Methoden, die aufgerufen werden, bevor EF ExecuteNonQuery, ExecuteScalar, ExecuteReader und verwandte Methoden aufruft.

  • Entity Framework kann durch Abfangen wirklich glänzen. Mit diesem Ansatz können Sie viel mehr Informationen vorübergehend erfassen, ohne Ihren Code aufräumen zu müssen.

  • Um dies zu implementieren, müssen Sie Ihren eigenen benutzerdefinierten Interceptor erstellen und entsprechend registrieren.

  • Sobald eine Klasse erstellt wurde, die die IDbCommandInterceptor-Schnittstelle implementiert, kann sie mithilfe der DbInterception-Klasse bei Entity Framework registriert werden.

  • Die IDbCommandInterceptor-Schnittstelle verfügt über sechs Methoden, und Sie müssen alle diese Methoden implementieren. Im Folgenden finden Sie die grundlegende Implementierung dieser Methoden.

Schauen wir uns den folgenden Code an, in dem die IDbCommandInterceptor-Schnittstelle implementiert ist.

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

}

Abfangjäger registrieren

Sobald eine Klasse erstellt wurde, die eine oder mehrere der Interception-Schnittstellen implementiert, kann sie mithilfe der DbInterception-Klasse bei EF registriert werden, wie im folgenden Code gezeigt.

DbInterception.Add(new MyCommandInterceptor());

Interceptors können auch auf App-Domain-Ebene mithilfe der DbConfiguration-Code-basierten Konfiguration registriert werden, wie im folgenden Code gezeigt.

public class MyDBConfiguration : DbConfiguration {

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

Sie können die Interceptor-Konfigurationsdatei auch mit dem folgenden Code konfigurieren:

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