从DbValidationException中获取确切的错误types

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

清除事情:

我知道如何解决string长度问题。 我在问什么是如何得到打破模型的确切字段名称。

当您在catch {...}块内进入debugging模式时,打开“QuickWatch”窗口( ctrl + alt + q )并粘贴到那里:

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

这将允许您深入查看ValidationErrors树。 这是我发现能够即时洞察这些错误的最简单的方法。

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

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

你可以尝试在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); } } } 

我认为最好的解决办法就是集中处理这类错误。

只需将此方法添加到主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); } } 

这将覆盖你的上下文的SaveChanges()方法,你会得到一个包含所有实体validation错误的逗号分隔的列表。

希望这是有帮助的。

那么,我有同样的问题。 我的模型在EF CTP5中运行良好,但是当我试图初始化它时,却无法在4.1版本中生成相同的错误“”一个或多个实体的validation失败“我发现我拥有属性:

 public string Comment {get; set;} 

然后在sorting的初始化器中用种子的方法,我有相当长的时间(约600个字母)的评论。

我认为重点是:在EF 4.1中,您必须在某些情况下明确设置数据注释。 对我来说,设置:

 [StringLength(4000)] public string Comment {get; set;} 

帮助。 这是奇怪的,因为CTP5没有问题。

我发现它是有用的创build一个SaveChanges包装,使EntityValidationErrors更具可读性:

 Public Sub SaveChanges(entities As Entities) Try entities.SaveChanges() Catch ex As DbEntityValidationException Dim msg As New StringBuilder msg.AppendLine(ex.Message) For Each vr As DbEntityValidationResult In ex.EntityValidationErrors For Each ve As DbValidationError In vr.ValidationErrors msg.AppendLine(String.Format("{0}: {1}", ve.PropertyName, ve.ErrorMessage)) Next Next Throw New DbEntityValidationException(msg.ToString, ex.EntityValidationErrors, ex) End Try End Sub 

然后在整个项目中将“entities.SaveChanges()”更改为“SaveChanges(entities)”