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 - 如何处理相关实体映射和保存