EF 6.x Контекст AddorUpdate завершается ошибкой при обновлении - PullRequest
0 голосов
/ 31 января 2019

У меня есть сценарий, в котором добавление записи работает нормально, но обновление записи завершается неудачно с ошибкой проверки при использовании 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 - нет, если значение свойства существует в обоих случаях.

1 Ответ

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

Ваш ExampleSchema имеет конфликтующие аннотации данных в свойстве Password:

[Required]
[NotMapped]
public string Password { get; set; }

[Required]:

Обязательная аннотация сообщаетEF о том, что требуется определенное свойство.

[NotMapped]

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


Похоже, в вашем случае вы, вероятно, просто хотите удалить атрибут NotMapped.

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