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)
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)
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()
方法,您将获得一个包含所有实体验证错误的逗号分隔列表.
希望这是有帮助的.