Entity Framework Core 在保存时不验证数据?

Posted

技术标签:

【中文标题】Entity Framework Core 在保存时不验证数据?【英文标题】:Entity Framework Core doesn't validate data when saving? 【发布时间】: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 会拒绝记录无效?这是预期的行为吗?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于Entity Framework Core 在保存时不验证数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Entity Framework Core 正确保存 DateTime?

Entity Framework Core 数据保存原理详解

Entity Framework Core 数据保存原理详解

Entity Framework Core - 如何处理相关实体映射和保存

有没有办法让 Entity Framework Core 部分保存数据?

如何使用 Entity Framework Core 在一种方法中保存两次更改