我想验证使用Entity Framework Core保存的对象图(来自不同但相关的实体)。在Entity Framework 6中,框架在SaveChanges Operation中验证它。在EF Core中,文档说验证不是自动执行的。因此,在ASP MVC Core中,我们可以使用ModelState.IsValid。但是,我没有使用ASP MVC,我宁愿不依赖那个非常大的框架。
无论如何,如何在EntityFramework Core 2中的SaveChanges之前验证模型,而不依赖于完整的ASP MVC框架?
答案 0 :(得分:3)
是的,看起来没有开箱即用的验证。您可以通过覆盖SaveChanges
:
public class MyContext : DbContext
{
public virtual DbSet<Model> Models { get; set; }
public MyContext()
{
}
public override int SaveChanges()
{
var changedEntities = ChangeTracker
.Entries()
.Where(_ => _.State == EntityState.Added ||
_.State == EntityState.Modified);
var errors = new List<ValidationResult>(); // all errors are here
foreach (var e in changedEntities)
{
var vc = new ValidationContext(e.Entity, null, null);
Validator.TryValidateObject(
e.Entity, vc, errors, validateAllProperties: true);
}
return base.SaveChanges();
}
}
public class Model
{
[Key]
public int Id { get; set; }
[Required]
[MaxLength(32)]
public string Field { get; set; }
[Range(15, 25)]
public int RangeField { get; set; }
}
validateAllProperties
很重要,因为没有它你
没有获得范围验证。SaveChangesAsync
。不幸的是,如果您使用fluent syntax
设置约束,这件事确实很有帮助。实际上,由于fluent syntax
可能不仅可以添加新约束,而且还可以覆盖现有约束,因此最好完全切换到属性注释,或者找到另一种方法进行验证。