Reputation: 30403
I have the following remote validation rule:
[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);
}
That's linked to a property in my class as follows:
[Required]
[Remote("ValidateWindowEndDate", "InspectionWindow", AdditionalFields = "StartDate")]
public DateTime EndDate { get; set; }
When I enter an invalid data in my view, the validation occurs as expected. But, if I get an instance of the object in code, then change the date to an invalid one and save it back to the database, e.g.
luInspectionWindow.EndDate = luInspectionWindow.StartDate.AddDays(1);
_context.Update(luInspectionWindow);
await _context.SaveChangesAsync();
then the save takes place without an exception and the validation method is never called, which wasn't the behaviour I was expecting. I thought EF would reject the record as invalid? Is this the expected behaviour?
Upvotes: 9
Views: 9262
Reputation: 30403
So, this turns out to be a change in the way EF works in Core. It now no longer does validation at all, that is left up to the Client and server (via Model.State
). Rowan Miller explains that decision in the EF repo as follows:
In EF Core we dropped doing validation since it is usually already done client-side, server-side, and then in the database too.
I can't use the model state in my particular scenario, so instead I've tried to get Remote validation working manually via the Validator
object, but I'm not having any luck with that either. More on that in this question: Validator.TryValidateObject does not call Remote validation.
Upvotes: 14