如何找到DbContext.SaveChanges异常的确切原因?

时间:2015-12-02 18:23:56

标签: entity-framework

为什么EF错误界面如此无益?当错误几乎没有告诉异常中涉及的参数时,如何找到DbContext.SaveChanges异常的确切原因?

我认为EF的一个严重缺点是在发出SaveChanges()后检测到导致特定异常的原因。

我一直在努力解决EF错误界面问题。我曾经通过编写method 展平所有数据库上下文验证错误来帮助自己,为每个错误提供表,列和错误消息的简单消息。否则,我必须深入研究dbContext返回的错误结构...我想知道为什么他们这样做了!

无论如何,对我的问题: 我在dbContext中的几个实体中执行了几个add操作,最后发出了一个SaveChanges()

现在,我GetValidationErrors()返回0错误,因此没有验证问题。 但是SaveChanges引发了以下异常:

  

将datetime2数据类型转换为日期时间数据类型   导致超出范围的价值。声明已经终止。

DbContext如何以任何方式指出错误的具体原因,当他传递给你的是一个内部对象的嵌套迷宫,如下所示:

enter image description here

?!

1 个答案:

答案 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);
        } 
    }
}