在WinForms上捕获EF4 ObjectContext异常的位置?

时间:2012-11-27 19:28:52

标签: c# winforms entity-framework

我很难弄清楚在哪里捕获实体框架异常。我有SaveChanges和并发异常,但是,我很难找到一个通用规则来捕获其他异常(比如超时,因为服务器出现故障或其他原因)。

我正在做一个Windows客户端应用程序,所以异常不能只是吐出一个“错误”的网页,他们必须提供继续申请的选项(因为你可能在其中打开了其他窗口,这不是简单的应用程序)

直接使用ADO.net时很容易理解:你会在连接打开和查询执行时捕获异常,但是我不太确定连接打开和查询时使用EF4执行(在这种情况下,数据库优先)。

有一些简单的情况(例如,当我实际在IQueryable上运行枚举器时,通过调用ToListToArray),但还有其他一些不容易发现:例如,如果我将IQueryable分配给WinForm控件的DataSource,取决于控件行为(我并不总是控制),它可能会也可能不会实际执行查询(有些控件在稍后调用DataBind时执行它。)

我知道我可以通过反复试验来做到这一点(或者只做巨大的try/catch块),但我正试图找出一种更通用的方法来做到这一点。

我已尝试在onexception上搜索某些ObjectContext类似的事件,但未发现任何远程事件,我在此问题上找到的所有内容都与{{1}上的例外有关和并发异常,正如我所说,我已经介绍过了。

关于去哪儿的任何提示?

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)
    {
    }
}