实体框架 – 验证

实体框架 – 验证


在本章中,让我们了解可在 ADO.NET Entity Framework 中用于验证模型数据的验证技术。实体框架提供了种类繁多的验证功能,这些功能可以实现到用户界面以进行客户端验证,也可以用于服务器端验证。

  • 在实体框架中,数据验证是用于在应用程序中捕获不良数据的解决方案的一部分。

  • 默认情况下,实体框架会在所有数据写入数据库之前对其进行验证,使用范围广泛的数据验证方法。

  • 但是,实体框架是在用户界面数据验证之后出现的。因此,在这种情况下,需要实体验证来处理 EF 引发的任何异常并显示通用消息。

  • 有一些数据验证技术可以改进您的错误检查以及如何将错误消息传回给用户。

DbContext 有一个称为 ValidateEntity 的 Overridable 方法。当您调用 SaveChanges 时,Entity Framework 将为其缓存中状态不是 Unchanged 的​​每个实体调用此方法。您可以将验证逻辑直接放在此处,如下面的学生实体示例所示。

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 

我们建议您逐步执行上述示例,以便更好地理解。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁