我很难弄清楚在哪里捕获实体框架异常。我有SaveChanges
和并发异常,但是,我很难找到一个通用规则来捕获其他异常(比如超时,因为服务器出现故障或其他原因)。
我正在做一个Windows客户端应用程序,所以异常不能只是吐出一个“错误”的网页,他们必须提供继续申请的选项(因为你可能在其中打开了其他窗口,这不是简单的应用程序)
直接使用ADO.net时很容易理解:你会在连接打开和查询执行时捕获异常,但是我不太确定当连接打开和查询时使用EF4执行(在这种情况下,数据库优先)。
有一些简单的情况(例如,当我实际在IQueryable
上运行枚举器时,通过调用ToList
或ToArray
),但还有其他一些不容易发现:例如,如果我将IQueryable
分配给WinForm控件的DataSource
,取决于控件行为(我并不总是控制),它可能会也可能不会实际执行查询(有些控件在稍后调用DataBind
时执行它。)
我知道我可以通过反复试验来做到这一点(或者只做巨大的try/catch
块),但我正试图找出一种更通用的方法来做到这一点。
我已尝试在onexception
上搜索某些ObjectContext
类似的事件,但未发现任何远程事件,我在此问题上找到的所有内容都与{{1}上的例外有关和并发异常,正如我所说,我已经介绍过了。
关于去哪儿的任何提示?
答案 0 :(得分:0)
unit of work
的概念吗?这通常定义context
开始和结束的边界。然后,可以将异常处理放在工作单元中/周围,以处理特定的异常。
这只是一个想法。
public void Execute(Action<DbContext> action)
{
try
{
using(var context = new MyContext())
{
action(context);
context.SaveChanges();
}
}
catch(ConcurrencyException exception)
{
}
catch(ValidationException exception)
{
}
catch(SqlException exception)
{
}
}