文
章
目
录
章
目
录
最近,就有一个项目在使用EF保存数据时,遭遇了这样一个异常报错:“Validation failed for one or more entities. See ‘EntityValidationErrors’ property for more details.”。从这个报错提示来看,它告诉我们在将实体保存到数据库的过程中,有一个或多个实体的验证没有通过。然而,这个报错信息并不够详细,并没有明确指出到底是哪个具体的属性或字段出现了验证问题。而且,如果涉及的表字段较多,逐个排查会非常麻烦。别着急,接下来就给大家分享一个实用的技巧,能帮助我们快速定位这类数据验证错误问题。
排查技巧
下面这段代码,主要是为了在使用EF进行数据库操作时,能够更优雅地捕获和处理验证失败的情况,同时输出详细的错误信息,方便开发者快速找到问题所在。
在EF的报错体系中,EntityValidationErrors
这个属性里包含了所有验证失败的实体的错误信息;而ValidationErrors
则包含了验证失败的实体中所有属性的验证错误(DbValidationError
) ,像必填字段没赋值、字段长度超出限制等问题,每个错误都会清楚地标注出PropertyName
(属性名)和ErrorMessage
(错误原因)。
try
{
// 这里可以写EF相关的数据库操作代码,例如进行数据的添加、修改等操作后,调用SaveChanges()来保存更改到数据库
}
catch (DbEntityValidationException ex)
{
// 遍历每个验证失败的实体
foreach (var entityError in ex.EntityValidationErrors)
{
// 输出当前验证失败的实体名称
Console.WriteLine($"实体名称: {entityError.Entry.Entity.GetType().Name}");
// 遍历该实体中所有验证失败的属性
foreach (var validationError in entityError.ValidationErrors)
{
// 输出具体的错误信息,包括属性名和错误原因
Console.WriteLine($"属性名称: {validationError.PropertyName}");
Console.WriteLine($"错误原因: {validationError.ErrorMessage}");
}
}
// 可以选择重新抛出异常,让上层调用者知道发生了错误,也可以根据实际情况在这里进行其他处理
throw;
}
通过这段代码,我们可以清晰地看到每个验证失败的实体对应的具体属性和错误原因,从而快速定位到问题出在哪里。这样,在面对EF保存数据时的验证错误问题时,我们就能更高效地进行排查和修复了。希望这个技巧能对大家有所帮助。