Entity Framework - Validación

En este capítulo, aprendamos sobre las técnicas de validación que se pueden usar en ADO.NET Entity Framework para validar los datos del modelo. Entity Framework proporciona una gran variedad de características de validación que pueden implementarse en una interfaz de usuario para la validación del lado del cliente o pueden usarse para la validación del lado del servidor.

  • En Entity Framework, la validación de datos es parte de la solución para detectar datos incorrectos en una aplicación.

  • Entity Framework valida todos los datos antes de que se escriban en la base de datos de forma predeterminada, utilizando una amplia gama de métodos de validación de datos.

  • Sin embargo, Entity Framework viene después de la validación de datos de la interfaz de usuario. Entonces, en ese caso, es necesario que la validación de la entidad maneje cualquier excepción que EF arroje y muestre un mensaje genérico.

  • Existen algunas técnicas de validación de datos para mejorar su verificación de errores y cómo devolver mensajes de error al usuario.

DbContext tiene un método reemplazable llamado ValidateEntity. Cuando llame a SaveChanges, Entity Framework llamará a este método para cada entidad en su caché cuyo estado no sea Sin cambios. Puede colocar la lógica de validación directamente aquí como se muestra en el siguiente ejemplo para la Entidad de estudiante.

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

En el método ValidateEntity anterior, las propiedades FirstMidName y LastName de la entidad Student se verifican si alguna de estas propiedades tiene una cadena vacía, luego devolverá un mensaje de error.

Echemos un vistazo a un ejemplo simple en el que se crea un nuevo estudiante, pero el FirstMidName del estudiante es una cadena vacía como se muestra en el siguiente código.

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

Cuando se compila y ejecuta el ejemplo anterior, recibirá el siguiente mensaje de error en la ventana de la consola.

Adding new Student to the database  
Error: FirstMidName is required

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprensión.