我有以下远程验证规则:
[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会拒绝该记录无效?这是预期的行为吗?
答案 0 :(得分:5)
所以,事实证明这是EF在Core中的工作方式的改变。它现在不再进行验证,而是留给客户端和服务器(通过Model.State)。 Rowan Miller explains that decision in the EF repo如下:
在EF Core中,我们放弃了验证,因为它通常已经存在 完成客户端,服务器端,然后在数据库中。
我无法在特定情况下使用模型状态,因此我尝试通过Validator
对象手动启用远程验证,但我没有也好运。有关此问题的更多信息:Validator.TryValidateObject does not call Remote validation。