Entity Framework - Walidacja

W tym rozdziale dowiemy się o technikach walidacji, których można użyć w ADO.NET Entity Framework do walidacji danych modelu. Entity Framework zapewnia szeroką gamę funkcji walidacji, które można zaimplementować w interfejsie użytkownika w celu walidacji po stronie klienta lub użyć do walidacji po stronie serwera.

  • W Entity Framework sprawdzanie poprawności danych jest częścią rozwiązania służącego do przechwytywania złych danych w aplikacji.

  • Entity Framework domyślnie sprawdza wszystkie dane, zanim zostaną one zapisane w bazie danych, przy użyciu szerokiego zakresu metod sprawdzania poprawności danych.

  • Jednak Entity Framework pojawia się po sprawdzeniu poprawności danych interfejsu użytkownika. W takim przypadku istnieje potrzeba walidacji jednostki, aby obsłużyć wszelkie wyjątki, które EF zgłasza i pokazać ogólny komunikat.

  • Istnieją pewne techniki sprawdzania poprawności danych, które usprawniają sprawdzanie błędów i przekazywanie komunikatów o błędach z powrotem do użytkownika.

DbContext ma metodę Overridable o nazwie ValidateEntity. Po wywołaniu SaveChanges Entity Framework wywoła tę metodę dla każdej jednostki w jej pamięci podręcznej, której stan nie jest niezmieniony. Możesz umieścić logikę walidacji bezpośrednio tutaj, jak pokazano w poniższym przykładzie dla jednostki ucznia.

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

W powyższej metodzie ValidateEntity właściwości jednostki ucznia FirstMidName i LastName są sprawdzane, jeśli którakolwiek z tych właściwości ma pusty ciąg, a następnie zwróci komunikat o błędzie.

Rzućmy okiem na prosty przykład, w którym tworzony jest nowy uczeń, ale jego FirstMidName jest pustym ciągiem, jak pokazano w poniższym kodzie.

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

Gdy powyższy przykład zostanie skompilowany i wykonany, w oknie konsoli pojawi się następujący komunikat o błędzie.

Adding new Student to the database  
Error: FirstMidName is required

Zalecamy wykonanie powyższego przykładu krok po kroku w celu lepszego zrozumienia.