首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SaveChanges内核2中验证EntityFramework之前的模型?

如何在SaveChanges内核2中验证EntityFramework之前的模型?
EN

Stack Overflow用户
提问于 2017-08-19 18:54:29
回答 1查看 4.2K关注 0票数 5

我想验证使用保存的对象图(来自不同但相关的实体)。在实体框架6中,该框架在SaveChanges操作中验证它。在EF中,docs表示验证不是自动执行的。因此,在ASP.MVC核心中,我们可以使用ModelState.IsValid。但是,我不使用ASP.MVC,我更喜欢不依赖于这个非常大的框架。

无论如何,我如何在SaveChanges核心2中验证EntityFramework之前的模型,而不依赖于完整的ASP.MVC框架?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-21 13:58:54

是的,看来没有开箱即用的验证。您可以通过重写SaveChanges来自己处理它

代码语言:javascript
复制
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可能不仅可以添加新的约束,而且还可以覆盖现有的约束,因此最好完全切换到属性注释,或者找到其他方法进行验证。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45775267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档