使用Entity Framework检测重复条目的更好方法

时间:2015-04-11 18:54:48

标签: c# entity-framework

我目前有以下代码来检测重复的条目,我想有一种更清洁的方式,但我还没有找到它......如果这是正确的方法,任何人都可以指导我吗?

catch (DbUpdateException e)
{
    if (e.InnerException != null)
       if (e.InnerException is UpdateException)
          if (e.InnerException.InnerException != null)
             if (e.InnerException.InnerException is SqlException)
             {
                 SqlException ex = e.InnerException.InnerException as SqlException;

                 if (ex.Number == 2601)
                 {
                     ModelState.AddModelError("", "Unit number already exists");
                 }
             }
         }
    }
}

2 个答案:

答案 0 :(得分:4)

调用Exception.GetBaseException(),这可以让您在更少的代码中找到最内层的异常。

catch (DbUpdateException e)
{
    var ex = e.GetBaseException() as SqlException;

    if (ex != null && ex.Number == 2601)
    {
        ModelState.AddModelError("", "Unit number already exists");
    }
    else
    {
         //The exception was some other kind we weren't expecting
         //Let the exception bubble.
         throw;
    }
}

如果您感兴趣的例外不是基本例外,或者您想确保e.InnerException处的图层是UpdateException而不是其他类型,那么您的代码仍然可以通过以下方式简化:删除冗余代码并按if进行多次检查。

catch (DbUpdateException e)
{
    bool handled = false;

    if (e.InnerException != null && e.InnerException is UpdateException)
    {
        var ex = e.InnerException.InnerException as SqlException;
        if (ex != null && ex.Number == 2601)
        {
            ModelState.AddModelError("", "Unit number already exists");
            handled = true;
        }
     }

     //The exception was some other kind we weren't expecting
     //Let the exception bubble.
     if(!handled)
         throw;
}

答案 1 :(得分:1)

建议不要使用Exceptions来编写应用程序逻辑。

如果单位没有,为什么不通过EF登记您的数据库?存在。如果存在,则显示验证错误,如果不存在则继续执行插入操作。

只需确保您的唯一列已编入索引。