对于 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?
保存时的模型验证已从 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/
当您查看 DbEntityValidationException 的文档时,您可以看到它适用的版本只有:4.3.1、5.0.0、6.2.0。
现在,如果您查看 SaveChanges 的文档(假设这就是您在 try 块中调用的内容,您可以看到它现在只抛出 DpUpdateException 和 DbUpdateConcurrencyException。所以我认为您可能想要的是下面的内容,因为应该在保存到数据库时捕获任何异常。我认为验证将包含在其中。
catch (DbUpdateException exception)
{
// any statements here...
throw;
}