实体框架核心在保存时不会验证数据?

时间:2017-04-15 12:39:47

标签: asp.net-core-mvc 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 个答案:

答案 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