Entity Framework Core doesn't validate data when saving?

asp.net-core-mvc c# entity-framework-core


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:

[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);
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?

9/30/2019 9:05:59 AM

Accepted Answer

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.

4/3/2020 10:28:40 AM

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow