【发布时间】:2015-03-05 21:28:25
【问题描述】:
我已经覆盖了我的ApplicationDbContext.SaveChanges() 方法。这通过在黄色和白色错误应用程序错误屏幕上提供立即可见的错误消息来帮助我。
但是当DateTime 列出现验证错误时,catch 子句似乎没有被激活。
这是为什么呢?以及如何识别无效列?
覆盖方法
public partial class ApplicationDbContext
{
public override int SaveChanges()
{
try
{
return base.SaveChanges(); //**error is thrown here**//
}
catch (DbEntityValidationException ex)
{
var sb = new StringBuilder();
foreach (var failure in ex.EntityValidationErrors)
{
sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
foreach (var error in failure.ValidationErrors)
{
sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
sb.AppendLine();
}
}
throw new DbEntityValidationException(
"Entity Validation Failed - errors follow:\n" +
sb.ToString(), ex
);
}
}
}
但是,DateTime 列未引发异常,但似乎未激活 catch 块。
【问题讨论】:
-
你没有捕捉到它的原因是被捕捉到的
DbEntityValidationException与被抛出的SqlException。解决办法差不多是certainly one of these causes -
谢谢。有什么我可以添加到发布的代码中来让我挂钩 SqlException 的吗?我真的只想访问导致异常的属性/字段名称。
-
令人讨厌的是,Sql Server 实际上并没有列出错误的列名 AFAIK。如果您能够在执行语句(或粘贴到 LinqPad)时运行 Sql Profiler,则可以获取实际的 Sql。但可能的候选者是
DateTime尚未设置为 >1753(例如,未初始化为默认日期时间) -
真可惜。嗯,很高兴知道。您的组合 cmets 为我提供了答案。如果你想把它们组合成我可以这样标记。
标签: asp.net-mvc entity-framework try-catch