Entity Framework - Validation

Dans ce chapitre, nous allons découvrir les techniques de validation qui peuvent être utilisées dans ADO.NET Entity Framework pour valider les données du modèle. Entity Framework fournit une grande variété de fonctionnalités de validation qui peuvent être implémentées sur une interface utilisateur pour la validation côté client ou peuvent être utilisées pour la validation côté serveur.

  • Dans Entity Framework, la validation des données fait partie de la solution pour intercepter les mauvaises données dans une application.

  • Entity Framework valide toutes les données avant qu'elles ne soient écrites dans la base de données par défaut, à l'aide d'un large éventail de méthodes de validation des données.

  • Cependant, Entity Framework vient après la validation des données de l'interface utilisateur. Dans ce cas, il est donc nécessaire que la validation d'entité gère toutes les exceptions levées par EF et affiche un message générique.

  • Il existe certaines techniques de validation des données pour améliorer votre vérification des erreurs et comment renvoyer les messages d'erreur à l'utilisateur.

DbContext a une méthode Overridable appelée ValidateEntity. Lorsque vous appelez SaveChanges, Entity Framework appellera cette méthode pour chaque entité de son cache dont l'état n'est pas inchangé. Vous pouvez placer la logique de validation directement ici, comme illustré dans l'exemple suivant pour l'entité étudiante.

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

Dans la méthode ValidateEntity ci-dessus, les propriétés FirstMidName et LastName de l'entité Student sont vérifiées si l'une de ces propriétés a une chaîne vide, puis elle renverra un message d'erreur.

Jetons un coup d'œil à un exemple simple dans lequel un nouvel étudiant est créé, mais le FirstMidName de l'étudiant est une chaîne vide, comme indiqué dans le code suivant.

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

Lorsque l'exemple ci-dessus est compilé et exécuté, vous recevrez le message d'erreur suivant dans la fenêtre de la console.

Adding new Student to the database  
Error: FirstMidName is required

Nous vous recommandons d'exécuter l'exemple ci-dessus étape par étape pour une meilleure compréhension.