Entity Framework - Convalida

In questo capitolo apprendiamo le tecniche di convalida che possono essere utilizzate in ADO.NET Entity Framework per convalidare i dati del modello. Entity Framework fornisce una grande varietà di funzionalità di convalida che possono essere implementate in un'interfaccia utente per la convalida lato client o possono essere utilizzate per la convalida lato server.

  • In Entity Framework, la convalida dei dati fa parte della soluzione per la cattura di dati non validi in un'applicazione.

  • Entity Framework convalida tutti i dati prima che vengano scritti nel database per impostazione predefinita, utilizzando un'ampia gamma di metodi di convalida dei dati.

  • Tuttavia, Entity Framework viene fornito dopo la convalida dei dati dell'interfaccia utente. Quindi, in quel caso, è necessaria la convalida dell'entità per gestire le eccezioni generate da EF e mostrare un messaggio generico.

  • Esistono alcune tecniche di convalida dei dati per migliorare il controllo degli errori e come ritrasmettere i messaggi di errore all'utente.

DbContext dispone di un metodo Overridable denominato ValidateEntity. Quando chiami SaveChanges, Entity Framework chiamerà questo metodo per ogni entità nella sua cache il cui stato non è Unchanged. È possibile inserire la logica di convalida direttamente qui come mostrato nell'esempio seguente per l'entità studente.

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

Nel metodo ValidateEntity sopra, le proprietà FirstMidName e LastName dell'entità Student vengono controllate se una qualsiasi di queste proprietà ha una stringa vuota, quindi restituirà un messaggio di errore.

Diamo un'occhiata a un semplice esempio in cui viene creato un nuovo studente, ma il FirstMidName dello studente è una stringa vuota come mostrato nel codice seguente.

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 l'esempio precedente viene compilato ed eseguito, verrà visualizzato il seguente messaggio di errore nella finestra della console.

Adding new Student to the database  
Error: FirstMidName is required

Ti consigliamo di eseguire l'esempio precedente in modo graduale per una migliore comprensione.