我有一个使用实体框架的项目。而在我的DbContext上调用SaveChanges时,我得到了以下异常:

System.Data.Entity.Validation.DbEntityValidationException:验证 一个或多个实体失败。参见'EntityValidationErrors'属性 欲知详情。

这一切都很好,但我不希望每次发生此异常时都附加调试器。此外,在生产环境中,我不能轻易地附加调试器,因此我必须竭尽全力重现这些错误。

我如何才能看到隐藏在DbEntityValidationException中的细节?


当前回答

我认为“实际的验证错误”可能包含敏感信息,这可能是微软选择将它们放在另一个地方(属性)的原因。这里标出的解决办法是可行的,但应谨慎使用。

我更喜欢创建一个扩展方法。还有更多的原因:

保留原始堆栈跟踪 遵循开放/封闭原则。:我可以对不同类型的日志使用不同的消息) 在生产环境中,可能存在其他位置(例如。: other dbcontext),其中DbEntityValidationException可能被抛出。

其他回答

在调试过程中通过检查错误来快速找到有意义的错误消息:

添加一个快速手表: ((System.Data.Entity.Validation.DbEntityValidationException)例外)美元.EntityValidationErrors 向下钻取EntityValidationErrors,如下所示: > ValidationErrors >(收集项,如[0])> ErrorMessage

要查看EntityValidationErrors集合,请将以下Watch表达式添加到Watch窗口。

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

我使用的是visual studio 2013

Actually, this is just the validation issue, EF will validate the entity properties first before making any changes to the database. So, EF will check whether the property's value is out of range, like when you designed the table. Table_Column_UserName is varchar(20). But, in EF, you entered a value that longer than 20. Or, in other cases, if the column does not allow to be a Null. So, in the validation process, you have to set a value to the not null column, no matter whether you are going to make the change on it. I personally, like the Leniel Macaferi answer. It can show you the detail of the validation issues

在代码中使用try块

try
{
    // Your code...
    // Could also be before try if you know the exception occurs in SaveChanges

    context.SaveChanges();
}
catch (DbEntityValidationException e)
{
    foreach (var eve in e.EntityValidationErrors)
    {
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
            eve.Entry.Entity.GetType().Name, eve.Entry.State);
        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                ve.PropertyName, ve.ErrorMessage);
        }
    }
    throw;
}

你也可以在这里查看详细信息

http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/ 一个或多个实体验证失败。更多细节请参见'EntityValidationErrors'属性 http://blogs.infosupport.com/improving-dbentityvalidationexception/

当您在catch{…打开“QuickWatch”窗口(ctrl+alt+q)并粘贴在那里:

((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors

这将允许您深入到ValidationErrors树。这是我发现的最简单的方法来立即洞察这些错误。

对于Visual 2012+用户,他们只关心第一个错误,可能没有catch块,你甚至可以这样做:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors.First().ValidationErrors.First().ErrorMessage