我有一个使用实体框架的项目。而在我的DbContext上调用SaveChanges时,我得到了以下异常:
System.Data.Entity.Validation.DbEntityValidationException:验证
一个或多个实体失败。参见'EntityValidationErrors'属性
欲知详情。
这一切都很好,但我不希望每次发生此异常时都附加调试器。此外,在生产环境中,我不能轻易地附加调试器,因此我必须竭尽全力重现这些错误。
我如何才能看到隐藏在DbEntityValidationException中的细节?
对于Azure函数,我们使用这个简单的扩展Microsoft.Extensions.Logging.ILogger
public static class LoggerExtensions
{
public static void Error(this ILogger logger, string message, Exception exception)
{
if (exception is DbEntityValidationException dbException)
{
message += "\nValidation Errors: ";
foreach (var error in dbException.EntityValidationErrors.SelectMany(entity => entity.ValidationErrors))
{
message += $"\n * Field name: {error.PropertyName}, Error message: {error.ErrorMessage}";
}
}
logger.LogError(default(EventId), exception, message);
}
}
以及示例用法:
try
{
do something with request and EF
}
catch (Exception e)
{
log.Error($"Failed to create customer due to an exception: {e.Message}", e);
return await StringResponseUtil.CreateResponse(HttpStatusCode.InternalServerError, e.Message);
}
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/