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 не вызывает удаленную проверку.