Entity Framework Core не проверяет данные при сохранении?

У меня есть следующее правило удаленной проверки:

[AcceptVerbs("Get", "Post")]
public IActionResult ValidateWindowEndDate(DateTime? endDate, DateTime? startDate)
{
    int minWeeks = 8;

    if (startDate.HasValue && endDate.HasValue
            && (endDate < startDate.Value.AddDays(minWeeks * 7)))
    {
        return Json(data: $"Inspection window end date must be at least {minWeeks} weeks after start date.");
    }

    return Json(data: true);
}

Это связано со свойством в моем классе следующим образом:

[Required]
[Remote("ValidateWindowEndDate", "InspectionWindow", AdditionalFields = "StartDate")]
public DateTime EndDate { get; set; }

Когда я ввожу неверные данные в моем представлении, проверка происходит как ожидалось. Но если я получу экземпляр объекта в коде, то измените дату на недействительную и сохраните ее обратно в базу данных, например

luInspectionWindow.EndDate = luInspectionWindow.StartDate.AddDays(1);
_context.Update(luInspectionWindow);
await _context.SaveChangesAsync();

тогда сохранение происходит без исключения, и метод проверки никогда не вызывается, чего я не ожидал. Я думал, что EF отклонит запись как недействительную? Это ожидаемое поведение?

1 ответ

Решение

Итак, это изменение в работе EF в Core. Теперь он больше не выполняет проверку, которая остается за клиентом и сервером (через Model.State). Роуэн Миллер объясняет это решение в репозитории EF следующим образом:

В EF Core мы прекратили делать проверку, так как она обычно уже выполняется на стороне клиента, на стороне сервера, а затем и в базе данных.

Я не могу использовать состояние модели в моем конкретном сценарии, поэтому вместо этого я попытался заставить удаленную проверку работать вручную через Validator объект, но мне тоже не повезло. Подробнее об этом в этом вопросе: Validator.TryValidateObject не вызывает удаленную проверку.

Другие вопросы по тегам