从DbValidationException获取确切的错误类型

Naz*_*gol 183 .net entity-framework ef-code-first entity-framework-4.1

我有这样的情况,我在DatabaseInitializer()中为EF 4.1初始化我的模型,并得到这个恼人的错误"Validation failed for one or more entities. See 'EntityValidationErrors' property for more details."所以,我去了这个EntityValidationErrors,有一个字段{System.Data.Entity.Validation.DbEntityValidationResult},根本没有给我任何关于它无法初始化的字段的信息.有没有办法获得有关此错误的更多信息?

清除问题:

我知道如何解决字符串长度问题.我问的是如何获得打破模型的确切字段名称.

GON*_*ale 376

当您处于catch {...}块内的调试模式时,打开"QuickWatch"窗口(ctrl+ alt+ q)并粘贴到那里:

((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors
Run Code Online (Sandbox Code Playgroud)

这将允许您深入到ValidationErrors树中.这是我发现能够即时了解这些错误的最简单方法.

对于只关心第一个错误并且可能没有catch块的Visual 2012+用户,您甚至可以执行以下操作:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors.First().ValidationErrors.First().ErrorMessage
Run Code Online (Sandbox Code Playgroud)

  • 如果你没有catch块,你可以用`$ exception`替换`ex`并获得相同的结果. (98认同)
  • 这比其他答案好:) (9认同)
  • 对于那些没有引用System.Linq并使用立即窗口的人:`System.Linq.Enumerable.ToList(System.Linq.Enumerable.ToList(((System.Data.Entity.Validation.DbEntityValidationException)$ exception).EntityValidationErrors)[0] .ValidationErrors)[0] .ErrorMessage` (3认同)

Tre*_*oll 123

你可以在try/catch块中尝试这个吗?

catch (DbEntityValidationException dbEx)
{
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您不想更改任何代码,请参阅我的回答. (9认同)

Cht*_*lek 10

在我看来,最好的解决方案是以集中的方式处理这种错误.

只需将此方法添加到主DbContext类:

public override int SaveChanges()
{
    try
    {
        return base.SaveChanges();
    }
    catch (DbEntityValidationException ex)
    {
        string errorMessages = string.Join("; ", ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.PropertyName + ": " + x.ErrorMessage));
        throw new DbEntityValidationException(errorMessages);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将覆盖您的上下文的SaveChanges()方法,您将获得一个包含所有实体验证错误的逗号分隔列表.

希望这是有帮助的.