如何在EntityFramework Core 2中在SaveChanges之前验证模型?

gab*_*mgp 5 entity-framework-core

我想验证使用Entity Framework Core保存的对象图(来自不同但相关的实体)。在实体框架6中,框架在SaveChanges操作中对其进行验证。文档说,在EF Core中,验证不会自动执行。因此,在ASP MVC Core中,我们可以使用ModelState.IsValid。但是,我没有使用ASP MVC,而且我更愿意不依赖于那个非常大的框架。

无论如何,如何在不依赖完整ASP MVC框架的情况下在EntityFramework Core 2中在SaveChanges之前验证模型?

cas*_*rad 7

是的,看起来没有开箱即用的验证。您可以通过覆盖自己处理它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; }
}
Run Code Online (Sandbox Code Playgroud)
  • 属性validateAllProperties很重要,因为没有它,您将无法获得范围验证。
  • 不要忘记覆盖SaveChangesAsync.

fluent syntax不幸的是,如果您使用 设置约束,这将不会真正有帮助。实际上,由于fluent syntax不仅可以添加新约束,还可以覆盖现有约束,因此最好完全切换到属性注释,或者寻找其他方法进行验证。