.NET Core 2 - EF Core 错误处理 保存更改

Posted

技术标签:

【中文标题】.NET Core 2 - EF Core 错误处理 保存更改【英文标题】:.NET Core 2 - EF Core Error handling Save changes 【发布时间】: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 中的预期实体验证错误类型是什么?

【问题讨论】:

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

以上是关于.NET Core 2 - EF Core 错误处理 保存更改的主要内容,如果未能解决你的问题,请参考以下文章

带有 .NET EF Core 的内存缓存抛出错误

.Net Core 3 和 EF Core 3 包含问题 (JsonException)

如何使用 EF Core 在 ASP.NET Core 中取消应用迁移

Azure Functions .NET Core 中的 EF Core 2.0 连接字符串

ef core 子对象集合插入顺序

.NET CORE 2 EF 包括