Entity Framework - การตรวจสอบความถูกต้อง

ในบทนี้ให้เราเรียนรู้เกี่ยวกับเทคนิคการตรวจสอบความถูกต้องที่สามารถใช้ใน ADO.NET Entity Framework เพื่อตรวจสอบความถูกต้องของข้อมูลแบบจำลอง Entity Framework มีคุณลักษณะการตรวจสอบความถูกต้องที่หลากหลายซึ่งสามารถนำไปใช้กับอินเทอร์เฟซผู้ใช้สำหรับการตรวจสอบฝั่งไคลเอ็นต์หรือสามารถใช้สำหรับการตรวจสอบความถูกต้องทางฝั่งเซิร์ฟเวอร์

  • ใน Entity Framework การตรวจสอบข้อมูลเป็นส่วนหนึ่งของโซลูชันสำหรับการดักจับข้อมูลที่ไม่ดีในแอปพลิเคชัน

  • Entity Framework ตรวจสอบความถูกต้องของข้อมูลทั้งหมดก่อนที่จะเขียนลงในฐานข้อมูลโดยค่าเริ่มต้นโดยใช้วิธีการตรวจสอบข้อมูลที่หลากหลาย

  • อย่างไรก็ตาม Entity Framework มาหลังจากการตรวจสอบข้อมูลอินเทอร์เฟซผู้ใช้ ดังนั้นในกรณีนี้จำเป็นต้องมีการตรวจสอบเอนทิตีเพื่อจัดการกับข้อยกเว้นใด ๆ ที่ EF พ่นและแสดงข้อความทั่วไป

  • มีเทคนิคบางอย่างในการตรวจสอบข้อมูลเพื่อปรับปรุงการตรวจสอบข้อผิดพลาดและวิธีส่งข้อความแสดงข้อผิดพลาดกลับไปยังผู้ใช้

DbContext มีเมธอด Overridable ที่เรียกว่า ValidateEntity เมื่อคุณเรียกใช้ SaveChanges Entity Framework จะเรียกเมธอดนี้สำหรับแต่ละเอนทิตีในแคชที่มีสถานะไม่เปลี่ยนแปลง คุณสามารถใส่ตรรกะการตรวจสอบได้โดยตรงที่นี่ดังที่แสดงในตัวอย่างต่อไปนี้สำหรับเอนทิตีนักเรียน

public partial class UniContextEntities : DbContext {

   protected override System.Data.Entity.Validation
      .DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, 
      System.Collections.Generic.IDictionary<object, object> items) {

         if (entityEntry.Entity is Student) {

            if (entityEntry.CurrentValues.GetValue<string>("FirstMidName") == "") {

               var list = new List<System.Data.Entity
                  .Validation.DbValidationError>();

               list.Add(new System.Data.Entity.Validation
                  .DbValidationError("FirstMidName", "FirstMidName is required"));

               return new System.Data.Entity.Validation
                  .DbEntityValidationResult(entityEntry, list);
            }
         }

         if (entityEntry.CurrentValues.GetValue<string>("LastName") == "") {

            var list = new List<System.Data.Entity
               .Validation.DbValidationError>();

            list.Add(new System.Data.Entity.Validation
               .DbValidationError("LastName", "LastName is required"));

            return new System.Data.Entity.Validation
               .DbEntityValidationResult(entityEntry, list);
         }

         return base.ValidateEntity(entityEntry, items);
   }
}

ในวิธีการ ValidateEntity ข้างต้นคุณสมบัติ Student entity FirstMidName และ LastName จะถูกตรวจสอบว่าคุณสมบัติใด ๆ เหล่านี้มีสตริงว่างเปล่าจากนั้นจะส่งคืนข้อความแสดงข้อผิดพลาด

มาดูตัวอย่างง่ายๆที่นักเรียนใหม่ถูกสร้างขึ้น แต่ FirstMidName ของนักเรียนเป็นสตริงว่างดังที่แสดงในโค้ดต่อไปนี้

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         Console.WriteLine("Adding new Student to the database");
         Console.WriteLine();

         try {

            context.Students.Add(new Student() {
               FirstMidName = "",
               LastName = "Upston"
            });

            context.SaveChanges();
         } catch (DbEntityValidationException dbValidationEx) {

            foreach (DbEntityValidationResult entityErr in 
               dbValidationEx.EntityValidationErrors) {

               foreach (DbValidationError error in entityErr.ValidationErrors) {
                  Console.WriteLine("Error: {0}",error.ErrorMessage);
               }
            }
         }

         Console.ReadKey();
      }
   }
}

เมื่อรวบรวมและดำเนินการตัวอย่างข้างต้นคุณจะได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้บนหน้าต่างคอนโซล

Adding new Student to the database  
Error: FirstMidName is required

เราขอแนะนำให้คุณดำเนินการตามตัวอย่างข้างต้นในลักษณะทีละขั้นตอนเพื่อความเข้าใจที่ดีขึ้น