У меня есть сценарий, в котором добавление записи работает нормально, но обновление записи завершается неудачно с ошибкой проверки при использовании context.AddOrUpdate
в EF 6.
Ошибка указывает на то, что обязательное поле отсутствует, однако полена самом деле существует и заполняется.
Домен Object
public class ExampleSchema {
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
[NotMapped]
public string Password { get; set; }
}
EF Object
public class ExampleSchemaEf : ExampleSchema {
public string SecurePassword { get; set; }
}
Мы используем AutoMapper длякарта между объектом домена и объектом EF.Это сопоставление выполняется с помощью простого оператора MapFrom
, который шифрует пароль, предоставленный пользователем при переходе от объекта домена к объекту EF.
cfg.CreateMap<ExampleSchema, ExampleSchemaEf>().ForMember(e => e.SecurePassword, opt => opt.MapFrom(e => e.Password.Encrypt(config.HashPassphrase)));
Ниже приведен метод, который записываетизменения в базе данных.
private async Task<int> SaveInternalAsync(TEntity entity, DbContext context {
var efEntity = DbContextProvider.Map<TEntity, TEfEntity>(entity);
context.Set<TEfEntity>().AddOrUpdate(efEntity);
await context.SaveChangesAsync();
return efEntity.Id;
}
При добавлении новой записи проблем нет.Тем не менее, обновление записи дает Entity Validation Error: "Password is required"
.Однако, если я прерву процесс и проверим значение efEntity, и пароль, и пароль SecurePassword существуют и будут заполнены правильно.Поэтому я не понимаю ошибку проверки.
Примечание. Добавление следующей строки кода дает мне обходной путь, но я все же хотел бы понять, почему средство проверки EF считает, что пароль для попытки не введенобновление.
context.Configuration.ValidateOnSaveEnabled = false;
Редактировать:
Основываясь на ответе DevNull ниже, я отредактировал объект EF так, чтобы он не происходил от объекта домена изатем удалил атрибут Required из поля Password.Это устраняет ошибку проверки без отключения проверки.Мне все еще интересно, почему add работает, а update - нет, если значение свойства существует в обоих случаях.