Учебники

Entity Framework — валидация

В этой главе мы узнаем о методах проверки, которые можно использовать в ADO.NET Entity Framework для проверки данных модели. Entity Framework предоставляет большое разнообразие функций проверки, которые могут быть реализованы в пользовательском интерфейсе для проверки на стороне клиента или могут использоваться для проверки на стороне сервера.

  • В Entity Framework проверка данных является частью решения для обнаружения неверных данных в приложении.

  • Entity Framework проверяет все данные перед их записью в базу данных по умолчанию, используя широкий спектр методов проверки данных.

  • Однако Entity Framework приходит после проверки данных пользовательского интерфейса. Таким образом, в этом случае существует необходимость в проверке сущности для обработки любых исключений, которые выдает EF, и отображения общего сообщения.

  • Существуют некоторые методы проверки данных для улучшения проверки ошибок и способов передачи сообщений об ошибках пользователю.

В Entity Framework проверка данных является частью решения для обнаружения неверных данных в приложении.

Entity Framework проверяет все данные перед их записью в базу данных по умолчанию, используя широкий спектр методов проверки данных.

Однако Entity Framework приходит после проверки данных пользовательского интерфейса. Таким образом, в этом случае существует необходимость в проверке сущности для обработки любых исключений, которые выдает EF, и отображения общего сообщения.

Существуют некоторые методы проверки данных для улучшения проверки ошибок и способов передачи сообщений об ошибках пользователю.

DbContext имеет переопределенный метод, называемый ValidateEntity. Когда вы вызываете SaveChanges, Entity Framework вызывает этот метод для каждого объекта в его кэше, состояние которого не является неизменным. Вы можете поместить логику проверки прямо здесь, как показано в следующем примере для объекта Student.

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

В указанном выше методе ValidateEntity свойства Student Entity FirstMidName и LastName проверяются, если какое-либо из этих свойств имеет пустую строку, а затем возвращает сообщение об ошибке.

Давайте рассмотрим простой пример, в котором создается новый студент, но FirstMidName студента — это пустая строка, как показано в следующем коде.

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

Когда приведенный выше пример скомпилирован и выполнен, вы получите следующее сообщение об ошибке в окне консоли.

Adding new Student to the database  
Error: FirstMidName is required 

Мы рекомендуем выполнить вышеприведенный пример пошагово для лучшего понимания.