Как запретить EF проверять свойства, которые не отображаются во время DBContext.SaveChanges () - PullRequest
6 голосов
/ 13 августа 2011

У меня есть пользовательская модель с двумя строковыми свойствами [NotMapped] Password и ConfirmPassword. Они не отображаются, потому что я сохраняю пароль в виде байтового массива (после засолки), поэтому в пользовательской модели есть два дополнительных свойства (сопоставленных) InternalPassword и Salt.

Проблема в том, что когда я использую пользовательскую модель для смены пароля, структура сущности выдает ошибку DBEntityValidation, в которой говорится: «Требуется свойство пароля». Здесь я понимаю, что EF пытается проверить мою модель перед сохранением и, поскольку Password / ConfirmPassword не установлены, он выдает эту ошибку. Это поднимает следующие вопросы:

1) Если свойство Password явно помечено как [NotMapped], почему EF проверяет его во время сохранения? 2) ЕСЛИ EF выполняет проверку во время сохранения, и то же самое также выполняется во время привязки (т.е. в методе действия контроллера), не ухудшает ли это производительность? (проверка дважды) 3) Каков рекомендуемый способ устранения этой ошибки? (Если я явно установлю в свойстве Password фиктивное значение, ошибка исчезнет.)

Редактировать: я удалил код, так как он длинный и может быть причиной отсутствия ответа. Если кто-то хочет посмотреть, я могу добавить его ниже.

Ответы [ 2 ]

10 голосов
/ 14 августа 2011

Автоматическая проверка в EF - это странная особенность - мне это не нравится. Вы можете прочитать эту статью , чтобы найти некоторую информацию о том, как проверить только выбранные свойства, но я ожидаю, что вы должны запустить эту проверку вручную и отключить глобальную проверку, вызвав:

context.Configuration.ValidateOnSaveEnabled = false;

Ваша проблема с NonMappedAttribute интересна. Я не углубился в реализацию валидации в EFv4.1, но если реализация построена на тех же правилах, что и обычная валидация на основе аннотаций данных, она использует только атрибуты, полученные из ValidationAttribute - NotMappedAttribute, а не из ValidationAttribute.

Это еще одна проблема такой реализации - она ​​объединяет определение и проверку соответствия, но эти две функции не одинаковы и не должны реализовываться одним и тем же API.

@ alun удалил свой ответ - правильный ответ на ваш вопрос. Ваша проверка принадлежит модели представления, зависящей от операции, которую выполняет пользователь. Это не относится к модели постоянства. Зачем? Именно из-за вашей текущей проблемы - модель постоянства может содержать только один набор проверки, и каждая операция в вашем приложении должна обеспечивать выполнение критериев проверки для этого набора = вы должны убедиться, что Password и ConfirmPassword заполнены, даже если ваша текущая операция не требует этого => проблема.

0 голосов
/ 29 января 2019

Старая тема, но поскольку я столкнулся с точно такой же проблемой с EF6, пожалуйста, позвольте мне поделиться своим опытом, если кто-то другой ищет ту же вещь.

Проблема: точно так же: поля Password & ConfirmPassword 2 [NotMapped] класса User. При попытке сохранить новую запись я получал исключение проверки того, что оба поля обязательны для заполнения.

Расследование: я заметил, что когда я обновлял запись пользователя, у меня не было проблем. В поисках разницы я обнаружил, что переопределил метод Validate

public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

для проверки модели MVC, и EF6 отображал мое пользовательское сообщение об ошибке! Вуаля! EF6 использовал также этот Validate метод! (и из-за ошибки в моем коде это вызвало ошибку).

Вывод: при сохранении сущности EF6 вызовет метод Validate, а любой 'ValidationResult' предотвратит запись для сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...