我目前有以下代码来检测重复的条目,我想有一种更清洁的方式,但我还没有找到它......如果这是正确的方法,任何人都可以指导我吗?
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");
}
}
}
}
}
答案 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登记您的数据库?存在。如果存在,则显示验证错误,如果不存在则继续执行插入操作。
只需确保您的唯一列已编入索引。