实体框架4.2:获取正确的数据库错误

时间:2011-12-27 13:36:25

标签: c# sql-server entity-framework exception-handling dbcontext

在我的ASP.NET MVC 3应用程序中,我使用EF 4.2。在我的数据库中,我对列有一个唯一的约束。

我尝试插入相同的数据以查看我得到的内容但是我收到以下错误:

  

更新条目时发生错误。查看内部异常   详情。

在内部异常内部,我可以看到有关唯一约束的完整错误。但是,如何才能唯一地捕获此异常以告诉用户:

  

您再次输入相同的值。

以下是我目前所做的事情:

try
{
    UpdateModel<ConditionType>(conditionType, null, null, new string[] { "ConditionTypeId" });
    _conditionTypeRepository.Save();

    return RedirectToAction("conditiontype");
}
catch (Exception ex)
{
    ModelState.AddModelError("", "There was an error while updating: " + ex.Message);
}

但这是一种通用方法。我想做的是提供一个特定的信息。

有什么想法吗?

修改

我厌倦了下面但是这次它没有抓住它:

catch (SqlException ex)
{
    if (ex.Number == 2627)
    {
        ModelState.AddModelError("", "You are entering the same value again.");
    }

    ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
}

我挖了一点,结果发现它抛出了一个不包含异常编号的异常类型System.Data.Entity.Infrastructure.DbUpdateException

修改

这里我如何解决问题,但我相信这不是解决问题的最佳方法。知道如何重构这段代码吗?

catch (Exception ex) {

    if (ex.InnerException.InnerException.GetType() == typeof(SqlException)) {

        if (((SqlException)ex.InnerException.InnerException).Number == 2627)
            ModelState.AddModelError("", "You are entering the same value again.");
        else
            ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);

    } else {
        ModelState.AddModelError("", "There was an error while updating the value: " + ex.Message);
    }
}

3 个答案:

答案 0 :(得分:3)

你可以做这样的事情来寻找一个SqlException的内部异常,然后以不同的方式处理sql异常。

catch(Exception ex)
{
    Exception current = ex;
    SqlException se = null;
    do
    {
        se = current.InnerException as SqlException;
        current = current.InnerException;
    }
    while (current != null && se == null);

    if (se != null)
    {
        // Do your SqlException processing here
    }
    else
    {
        // Do other exception processing here
    }
}

答案 1 :(得分:1)

也可以使用GetBaseException()方法,因为这会导致根本原因异常,即SqlException。

答案 2 :(得分:0)

要获得最里面的异常,你可以这样做:

SqlException se = null;
Exception next = ex;

while (next.InnerException != null) 
{
   se = next.InnerException as SqlException;
   next = next.InnerException;
}

if (se != null)
{
    // Do your SqlException processing here
}
else
{
    // Do other exception processing here
}