【问题标题】:.NET Core 2 - EF Core Error handling Save changes.NET Core 2 - EF Core 错误处理 保存更改
【发布时间】:2018-03-07 22:09:25
【问题描述】:

我习惯了 Entity Framework 6,我的 base 存储库 Save() 看起来像这样:

public void Save()
{
    try
    {
        Context.SaveChanges();
    }
    catch (DbEntityValidationException ex)
    {
        // Do stuff
    }
    catch (Exception exception)
    {
        // Do stuff
    }
    else
    {
        throw;
    }
}

DbEntityValidationException 是来自实体框架的预期错误,如果对象保存无效。现在我正在处理一个新的 .NET Core 2 项目。 Entity Framework Core 中的预期实体验证错误类型是什么?

【问题讨论】:

  • 你有没有想过尝试看看抛出了什么异常?
  • “异常”总是“意外”。如果您“预期”某些“特殊情况”(顺便说一句,为什么不阻止它?) - 这是您的应用程序特定的。

标签: c# entity-framework asp.net-core entity-framework-core asp.net-core-2.0


【解决方案1】:

查看 GitHub 问题,Entity Framework Core 中没有 DbEntityValidationException 等效项。 a blog post(从 GitHub 上的 issue #9662 链接)提供了一个代码示例,用于自己执行验证逻辑,为了完整起见,将其包含在此处:

class MyContext : DbContext
{
    public override int SaveChanges()
    {
        var entities = from e in ChangeTracker.Entries()
                       where e.State == EntityState.Added
                           || e.State == EntityState.Modified
                       select e.Entity;
        foreach (var entity in entities)
        {
            var validationContext = new ValidationContext(entity);
            Validator.ValidateObject(entity, validationContext);
        }

        return base.SaveChanges();
    }
}

如果验证失败,Validator.ValidateObject 将抛出 ValidationException,您可以进行相应处理。

链接问题中提供了更多信息,以防您遇到验证属性问题。


注意:Validator 类位于 System.ComponentModel.DataAnnotations 命名空间中。

【讨论】:

  • 不做参照完整性,只是数据注释样式验证。
  • 还有一个 TryValidateObject 可以让你在不抛出异常的情况下收集错误。
  • 如果您需要包含额外的验证,例如MinLength,您可能需要将validateAllProperties bool 参数添加为:Validator.ValidateObject(entity, validationContext, validateAllProperties: true)
猜你喜欢
  • 2021-03-25
  • 2018-05-06
  • 2021-12-25
  • 2013-10-27
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多