一尘不染

DbEntityValidationException-如何轻松分辨出导致错误的原因?

c#

我有一个使用实体框架的项目。在调用SaveChangesmy时DbContext,出现以下异常:

System.Data.Entity.Validation.DbEntityValidationException:对一个或多个实体的验证失败。有关更多详细信息,请参见’EntityValidationErrors’属性。

一切都很好,但我不想每次发生此异常时都附加一个调试器。而且,在生产环境中,我无法轻松地连接调试器,因此,我必须竭尽全力来重现这些错误。

如何查看隐藏在其中的详细信息DbEntityValidationException


阅读 580

收藏
2020-05-19

共1个答案

一尘不染

最简单的解决方案是SaveChanges在实体类上重写。您可以捕获DbEntityValidationException,解开实际的错误并DbEntityValidationException使用改进后的消息创建新的错误。

  1. 在SomethingSomething.Context.cs文件旁边创建一个局部类。
  2. 使用本文底部的代码。
  3. 而已。您的实现将自动使用覆盖的SaveChanges,而无需进行任何重构工作。

您的异常消息现在将如下所示:

System.Data.Entity.Validation.DbEntityValidationException:对一个或多个实体的验证失败。有关更多详细信息,请参见’EntityValidationErrors’属性。验证错误是:字段PhoneNumber必须是最大长度为‘12’的字符串或数组类型;姓氏字段是必填字段。

您可以将重写的SaveChanges放在继承自的任何类中DbContext

public partial class SomethingSomethingEntities
{
    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException ex)
        {
            // Retrieve the error messages as a list of strings.
            var errorMessages = ex.EntityValidationErrors
                    .SelectMany(x => x.ValidationErrors)
                    .Select(x => x.ErrorMessage);
    
            // Join the list to a single string.
            var fullErrorMessage = string.Join("; ", errorMessages);
    
            // Combine the original exception message with the new one.
            var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
    
            // Throw a new DbEntityValidationException with the improved exception message.
            throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
        }
    }
}

DbEntityValidationException还包含导致验证错误的实体。因此,如果您需要更多信息,则可以更改上面的代码以输出有关这些实体的信息。

另请参阅: http :
//devillers.nl/improving-
dbentityvalidationexception/

2020-05-19