Khung thực thể - Đánh chặn lệnh

Trong Entity Framework 6.0, có một tính năng mới khác được gọi là Interceptorhoặc Đánh chặn. Mã đánh chặn được xây dựng dựa trên khái niệminterception interfaces. Ví dụ, giao diện IDbCommandInterceptor xác định các phương thức được gọi trước khi EF thực hiện lệnh gọi ExecuteNonQuery, ExecuteScalar, ExecuteReader và các phương thức liên quan.

  • Entity Framework có thể thực sự tỏa sáng bằng cách sử dụng đánh chặn. Sử dụng cách tiếp cận này, bạn có thể nắm bắt được nhiều thông tin hơn một cách nhanh chóng mà không cần phải gỡ rối mã của mình.

  • Để thực hiện điều này, bạn cần tạo bộ đánh chặn tùy chỉnh của riêng mình và đăng ký nó cho phù hợp.

  • Khi một lớp triển khai giao diện IDbCommandInterceptor đã được tạo, nó có thể được đăng ký với Entity Framework bằng cách sử dụng lớp DbInterception.

  • Giao diện IDbCommandInterceptor có sáu phương thức và bạn cần triển khai tất cả các phương thức này. Sau đây là cách thực hiện cơ bản của các phương pháp này.

Hãy xem đoạn mã sau mà giao diện IDbCommandInterceptor được triển khai.

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

}

Đăng ký Interceptors

Sau khi một lớp thực thi một hoặc nhiều giao diện đánh chặn đã được tạo, nó có thể được đăng ký với EF bằng cách sử dụng lớp DbInterception như được hiển thị trong đoạn mã sau.

DbInterception.Add(new MyCommandInterceptor());

Các bộ chặn cũng có thể được đăng ký ở cấp miền ứng dụng bằng cách sử dụng cấu hình dựa trên mã DbConfiguration như được hiển thị trong đoạn mã sau.

public class MyDBConfiguration : DbConfiguration {

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

Bạn cũng có thể định cấu hình tệp cấu hình bộ đánh chặn bằng cách sử dụng mã -

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