为什么EF错误界面如此无益?当错误几乎没有告诉异常中涉及的参数时,如何找到DbContext.SaveChanges异常的确切原因?
我认为EF
的一个严重缺点是在发出SaveChanges()
后检测到导致特定异常的原因。
我一直在努力解决EF错误界面问题。我曾经通过编写method 展平所有数据库上下文验证错误来帮助自己,为每个错误提供表,列和错误消息的简单消息。否则,我必须深入研究dbContext返回的错误结构...我想知道为什么他们这样做了!
无论如何,对我的问题:
我在dbContext中的几个实体中执行了几个add操作,最后发出了一个SaveChanges()
。
现在,我GetValidationErrors()
返回0错误,因此没有验证问题。
但是SaveChanges
引发了以下异常:
将datetime2数据类型转换为日期时间数据类型 导致超出范围的价值。声明已经终止。
DbContext
如何以任何方式指出错误的具体原因,当他传递给你的是一个内部对象的嵌套迷宫,如下所示:
?!
答案 0 :(得分:0)
如果是DbEntityValidationException,你可以覆盖SaveChanges方法并抓住错误并重新抛出它,并解析出类似这样的错误:
public partial class MyEntities
{
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException ex)
{
var errorMessages = ex.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
var fullErrorMessage = string.Join("\n\r", errorMessages);
var exceptionMessage = string.Concat(ex.Message, "The validation errors are: ", fullErrorMessage);
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
}
}
}