Почему мой валидатор не улавливает ошибки обязательных полей - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть требование изменить любые пустые текстовые поля на пустые строки при сохранении. В моем коде ниже, который основан на этой записи , Validator.TryValidateObject() возвращает true, даже если в сущности есть несколько нулевых строк. Затем dbContext.SaveChanges() выдает Microsoft.EntityFrameworkCore.DbUpdateException с внутренним значением SqlException, говорящим «Невозможно вставить значение NULL в столбец X».

Почему Validator.TryValidateObject() не перехватывает этот столбец null и как я могу это исправить?

Поймать SqlException неудобно, потому что трудно определить, какой столбец null, не говоря уже о неэффективности try-catch.

public static void SaveChangesWithEmptyStrings(this DbContext dbContext) {
    var entities =
        from e in dbContext.ChangeTracker.Entries()
        where e.State == EntityState.Added
               || e.State == EntityState.Modified
        select e.Entity;
    foreach (var entity in entities) {
        var validationContext = new ValidationContext(entity);
        List<ValidationResult> results = new List<ValidationResult>();
        if (Validator.TryValidateObject(entity, validationContext, results))
            continue;
        foreach (ValidationResult result in results)
            if (result.ErrorMessage.Contains("Cannot insert the value NULL"))
                foreach (string name in result.MemberNames)
                    // Code to set the column to an empty string
    }
    dbContext.SaveChanges();
}
...