我在我的应用程序中使用EF并且它正在抛出异常
System.Data.Entity.Validation.DbEntityValidationException:一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。在Capture.Controllers.HomeController.AddFirstVisit(Int32 companyId)的System.Data.Entity.Internal.InternalContext.SaveChanges()中
我可以看到我需要做些什么来了解错误 - 我需要看EntityValidationErrors
但问题是我无法调试 - 代码需要运行服务器,因此本地运行不会重现这个错误。
我遇到的问题是,在没有看到对象的情况下,如何将execption作为字符串输出?
目前,我使用catch(Exception e)
并将e.ToString()
传递给我的日志记录引擎。
如何传递错误详情?我希望像
这样的东西catch(Exception e)
{
e.innerException.EntityValidationErrors; // what should this be
}
这几乎有答案EF Code First: How do I see 'EntityValidationErrors' property from the nuget package console?,但我没有选择e.EntityValidationErrors
答案 0 :(得分:4)
假设Log(string)
记录到您的日志记录引擎:
catch (DbEntityValidationException ex)
{
foreach (var evr in ex.EntityValidationErrors)
{
foreach (var error in evr.ValidationErrors)
{
Log(error.PropertyName + ": " + error.ErrorMessage);
}
}
}
答案 1 :(得分:1)
创建了一个处理模型状态错误的类。
public class Message
{
public string Title { get; set; }
public string Mensagem { get; set; }
public List<string> Itens { get; set; }
public string itensRetorno { get; set; }
public Message()
{
this.Itens = new List<string>();
}
public void Add(string item)
{
this.Itens.Add(item);
}
public string GetMessages()
{
var MsgItens = string.Empty;
foreach (var item in this.Itens)
{
MsgItens += "<li>" + item + "</li>";
}
this.itensRetorno = MsgItens;
return MsgItens;
}
public static class ModelStateUtils
{
public static Message GetModelStateErrors(ModelStateDictionary modelState)
{
Message msg = new Message();
List<string> errorKeys = new List<string>();
int index = 0;
foreach (var val in modelState.Values)
{
if (val.Errors.Count() > 0)
{
msg.Itens.Add(modelState.Keys.ElementAt(index));
}
index++;
}
msg.Title = "Erro";
msg.Mensagem = "Os seguintes campos são obrigatórios<br />" + msg.GetMessages();
return msg.Itens.Count() > 0 ? msg : null;
}
}
答案 2 :(得分:0)
首先捕获更具体的异常:
catch(DbEntityValidationException e)
{
// Do something with e.EntityValidationErrors;
}
catch(Exception e)
{
// Do whatever you were already doing with the generic exception
}