Entity Framework - Validação

Neste capítulo, vamos aprender sobre as técnicas de validação que podem ser usadas no ADO.NET Entity Framework para validar os dados do modelo. O Entity Framework fornece uma grande variedade de recursos de validação que podem ser implementados em uma interface de usuário para validação do lado do cliente ou podem ser usados ​​para validação do lado do servidor.

  • No Entity Framework, a validação de dados é parte da solução para capturar dados inválidos em um aplicativo.

  • O Entity Framework valida todos os dados antes de serem gravados no banco de dados por padrão, usando uma ampla variedade de métodos de validação de dados.

  • No entanto, o Entity Framework vem após a validação de dados da interface do usuário. Portanto, nesse caso, há uma necessidade de validação de entidade para lidar com quaisquer exceções que EF lança e mostra uma mensagem genérica.

  • Existem algumas técnicas de validação de dados para melhorar sua verificação de erros e como passar mensagens de erro de volta para o usuário.

DbContext tem um método Overridable chamado ValidateEntity. Quando você chama SaveChanges, o Entity Framework chama esse método para cada entidade em seu cache cujo estado não seja Inalterado. Você pode colocar a lógica de validação diretamente aqui, conforme mostrado no exemplo a seguir para a Entidade do Aluno.

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

No método ValidateEntity acima, as propriedades FirstMidName e LastName da entidade Student são verificadas se alguma dessas propriedades tiver uma string vazia, então ela retornará uma mensagem de erro.

Vamos dar uma olhada em um exemplo simples em que um novo aluno é criado, mas o FirstMidName do aluno é uma string vazia, conforme mostrado no código a seguir.

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

Quando o exemplo acima for compilado e executado, você receberá a seguinte mensagem de erro na janela do console.

Adding new Student to the database  
Error: FirstMidName is required

Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.