實體框架 - 驗證



本章我們將學習如何在 ADO.NET Entity Framework 中使用驗證技術來驗證模型資料。實體框架提供了多種驗證功能,可以實現到使用者介面中進行客戶端驗證,也可以用於伺服器端驗證。

  • 在實體框架中,資料驗證是應用程式中捕獲不良資料解決方案的一部分。

  • 實體框架預設情況下會在將所有資料寫入資料庫之前對其進行驗證,使用各種資料驗證方法。

  • 但是,實體框架在使用者介面資料驗證之後。因此,在這種情況下,需要實體驗證來處理 EF 丟擲的任何異常並顯示通用訊息。

  • 有一些資料驗證技術可以改進錯誤檢查以及如何將錯誤訊息傳遞迴使用者。

DbContext 有一個可重寫的方法,稱為 ValidateEntity。當您呼叫 SaveChanges 時,實體框架將為其狀態不是 Unchanged 的快取中的每個實體呼叫此方法。您可以像以下 Student 實體示例中所示那樣直接在此處放置驗證邏輯。

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 實體的 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 

我們建議您逐步執行上述示例,以便更好地理解。

廣告