Я ищу решение для выполнения некоторой проверки пользовательских сущностей (для чего требуется доступ к базе данных, проверка соответствия между членами...), когда пользователь сохраняет свои изменения на экране динамических данных с помощью Entity Framework.
Проверка более сложна, чем то, что я могу сделать с атрибутами (для этого требуется доступ к базе данных и т.д.)
Вы можете перехватить вызов SaveChanges?
Я попытался переопределить ValidateEntity
в объекте DbContext, но Dynamic Data, похоже, не вызывает его (возможно, потому, что он использует внутренний ObjectContext, не уверен, почему) и переопределение SaveChanges тоже не помогает.
Я не вижу никакого события, которое я мог бы подписаться на...
Документация должна помочь:
Настроить проверку для отдельного поля данных путем переопределения OnValidate или обрабатывать событие Validate, которое вызывается при изменении любого поля данных. Этот подход позволяет добавить подтверждение и бизнес-логику для отдельной области. Этот подход более чем добавление проверки для отдельного поля. Это полезно когда одна и та же логика проверки может применяться к нескольким данным поле. Он также позволяет выполнять проверки, которые включают несколько полей.
Но я использую классы POCO Entity Framework 6, поэтому нет метода OnValidate
для переопределения, и из того, что я прочитал, это для LinqToSql, и я не могу найти событие Validate
, которое они упоминают.
Я попытался подписаться на событие SavingChanges
внутреннего ObjectContext
в конструкторе моего DbContext, чтобы вручную вызвать ValidateEntity
, но я не знаю, что делать с результатом. Если я выброшу DbEntityValidationException
(или ValidationException
, как предлагается в этой статье), ASPNET обрабатывает его как любое исключение (желтый экран).
Реализация IValidatableObject
тоже не работает.
Я также попытался реализовать свой собственный DynamicValidator
, чтобы увидеть, что происходит, но без успеха, похоже, обрабатывает исключение (если я переопределяю ValidateException
и ставил точку останова, я это вижу), но он все еще пузырился к обработчику ошибок по умолчанию и отображает желтый экран. Мне что-то не хватает.
Итак, как вы должны выполнять сложную проверку (кросс-поле, с запросами и т.д.) для объектов перед сохранением в Dynamic Data/EF?