Entity Framework - การสกัดกั้นคำสั่ง

ใน Entity Framework 6.0 มีคุณลักษณะใหม่อื่นที่เรียกว่า Interceptorหรือการสกัดกั้น รหัสการสกัดกั้นถูกสร้างขึ้นตามแนวคิดของinterception interfaces. ตัวอย่างเช่นอินเทอร์เฟซ IDbCommandInterceptor กำหนดเมธอดที่ถูกเรียกก่อนที่ EF จะเรียกใช้ ExecuteNonQuery, ExecuteScalar, ExecuteReader และวิธีการที่เกี่ยวข้อง

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

}

การลงทะเบียน Interceptors

เมื่อสร้างคลาสที่ใช้อินเทอร์เฟซการสกัดกั้นอย่างน้อยหนึ่งคลาสแล้วจะสามารถลงทะเบียนกับ EF โดยใช้คลาส DbInterception ดังที่แสดงในโค้ดต่อไปนี้

DbInterception.Add(new MyCommandInterceptor());

นอกจากนี้ยังสามารถลงทะเบียนตัวสกัดกั้นที่ระดับโดเมนแอปโดยใช้การกำหนดค่าตามรหัส DbConfiguration ดังที่แสดงในรหัสต่อไปนี้

public class MyDBConfiguration : DbConfiguration {

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

คุณยังสามารถกำหนดค่าไฟล์กำหนดค่า interceptor โดยใช้รหัส -

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