【问题标题】:Entity Framework Core doesn't validate data when saving?Entity Framework Core 在保存时不验证数据?
【发布时间】:2017-04-15 12:39:47
【问题描述】:

我有以下远程验证规则:

[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 会拒绝记录无效?这是预期的行为吗?

【问题讨论】:

    标签: c# asp.net-core-mvc entity-framework-core


    【解决方案1】:

    因此,事实证明这是 EF 在 Core 中工作方式的改变。它现在根本不再进行验证,这留给客户端和服务器(通过Model.State)。 Rowan Miller explains that decision in the EF repo如下:

    在 EF Core 中,我们放弃了验证,因为它通常已经 在客户端、服务器端完成,然后在数据库中完成。

    我无法在我的特定场景中使用模型状态,因此我尝试通过 Validator 对象手动进行远程验证,但我也没有任何运气。有关此问题的更多信息:Validator.TryValidateObject does not call Remote validation

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多