在 EF Core 中使用什么来代替 DbEntityValidationException?

问题描述 投票:0回答:2

对于 EF,我使用了 DbEntityValidationException catch 分支(以及其他分支)

catch (DbEntityValidationException exception)
{
    // any statements here...
    throw;
}

现在将 .NET Core 3.17 与 EF Core 3.17 一起使用,显然没有 DbEntityValidationException,并且还查看了 EF Core 3.17 源,并且没有该异常类型的痕迹。 (请注意,我不仅谈论它的定义位置,我的意思是它没有被扔到 EF Core 3.17 源代码中的任何位置)

问题

如何将上面的代码迁移到 EF Core 3.17?

c# entity-framework .net-core entity-framework-core entity-framework-6
2个回答
2
投票

保存时的模型验证已从 EF core 中消失。这是来自 EF 开发者的一句话:

验证发生在客户端,然后再次进行操作以防止恶意请求。大多数验证也发生在数据库中(列的可为空性、数据的最大长度等)。显然,并非所有应用程序都走得那么远,但在 SaveChanges 期间进行验证通常只是预先加载从数据库中获得的异常,并增加执行此操作的开销。

说,如果你认为你还需要它,你的对象可以实现

IValidatableObject
并且可以通过覆盖
SaveChanges
来使用该接口:

public override int SaveChanges() {
    var validationErrors = ChangeTracker
        .Entries<IValidatableObject>()
        .SelectMany(e => e.Entity.Validate(null))
        .Where(r => r != ValidationResult.Success);

    if (validationErrors.Any()) {
       // Possibly throw an exception here
    }

   return base.SaveChanges();
}

另请参阅:https://long2know.com/2016/07/porting-ef6-to-ef7-or-ef-core/


2
投票

当您查看 DbEntityValidationException 的文档时,您可以看到它适用的版本只有:4.3.1、5.0.0、6.2.0。

现在,如果您查看 SaveChanges 的文档(假设这就是您在 try 块中调用的内容,您可以看到它现在只抛出 DpUpdateException 和 DbUpdateConcurrencyException。所以我认为您可能想要的是下面的内容,因为应该在保存到数据库时捕获任何异常。我认为验证将包含在其中。

catch (DbUpdateException exception)
{
    // any statements here...
    throw;
}
© www.soinside.com 2019 - 2024. All rights reserved.