【问题标题】:Entity Framework check for DbUpdateException before SaveChanges实体框架在 SaveChanges 之前检查 DbUpdateException
【发布时间】:2018-06-13 10:28:17
【问题描述】:

如果您尝试将长度为 500 的字符串保存到 Sql Server 中的 nvarchar(255) 列,您将获得 DbUpdateException

在调用SaveChanges() 之前有没有办法检查这个错误?也许在将实体添加到上下文时?

【问题讨论】:

  • 正如下面的答案所述,是的,您可以这样做。但是,您确实应该在这些错误成为问题之前发现它们。在输入接近上下文之前验证输入。
  • 找到字符串的长度并写出 if(len>255) throw err 之类的条件
  • @DavidG 是的,我听说您应该在进入上下文之前进行验证,但这是为什么呢?因为性能?

标签: entity-framework savechanges


【解决方案1】:

在调用 SaveChanges 之前有什么方法可以检查此错误吗?也许在将实体添加到上下文时?

是的。可以通过在您的DbContext 上调用此方法GetValidationErrors() 来实现,如下所示,但只有在您的实体类上使用data annoations attributes 时,您才会得到验证错误结果

var validationResults = dbContext.GetValidationErrors();

validationResults 将包含DbEntityValidationResult 的集合,因此如果为空,则您的跟踪实体是有效的。然后在之后调用SaveChanges 不会引发有关数据验证的异常,但您仍然可以获得一些只能在服务器端检查的其他异常,例如并发异常、唯一性或引用约束异常等

【讨论】:

  • 好的,太好了! StringLength 属性有效!有没有办法使用数据注释属性来检查十进制长度?
  • 是的,它存在 => RangeAttribute.
  • 好的,但是您如何定义 0 到 16 位的范围?
  • @skjold this 可以帮助你。
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多