C# 使用实体框架检测重复条目的更好方法
我目前有以下代码来检测重复条目,我想有一个更干净的方法,但我还没有找到它。。。。如果这是正确的方法,谁能指导我C# 使用实体框架检测重复条目的更好方法,c#,entity-framework,C#,Entity Framework,我目前有以下代码来检测重复条目,我想有一个更干净的方法,但我还没有找到它。。。。如果这是正确的方法,谁能指导我 catch (DbUpdateException e) { if (e.InnerException != null) if (e.InnerException is UpdateException) if (e.InnerException.InnerException != null) if (e.InnerExc
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");
}
}
}
}
}
不建议使用异常来编写应用程序逻辑 如果单元号存在,为什么不通过EF签入数据库呢。如果存在,则显示验证错误,如果不存在,则继续执行插入操作
只需确保您的唯一列已编制索引。不建议使用异常来编写应用程序逻辑 如果单元号存在,为什么不通过EF签入数据库呢。如果存在,则显示验证错误,如果不存在,则继续执行插入操作 只需确保您的唯一列已被索引。调用,这样您就可以用更少的代码访问最内部的异常
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;
}
调用,这使您可以用更少的代码访问最内部的异常
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;
}
它可以使用一点代码清理来让它变得更好,但是让DB的外键捕捉这样的错误是一种很好的方法,可能也是最有效的方法。它可以使用一点代码清理来让它变得更好,但是,让DB的外键捕捉这些错误是一种很好的方法,可能也是最有效的方法。这样做会为其他人在您的检查和插入之间插入记录创造机会。依靠foreing键是一条路,那里的失败会通过异常反映出来。您可以针对这些竞争条件管理异常,但我仍然不建议将其用作应用程序逻辑。在这一点上,您基本上回到了最初的操作代码,作为最后的手段进行检查,只是事先进行一次毫无意义且低效的检查。在这种情况下,只要有外键,让DB爆炸并捕获异常是有意义的。不,这不是一个无意义的检查。异常处理涉及大量开销。读这个。然后在1000条记录上尝试这段代码,其中所有1000条记录都存在于DB中。异常是缓慢的是,但仅与其他C#代码相关。检查包括到服务器进行第二次往返(包括所有相关的网络成本),而这比捕获异常要慢得多。这样做会产生竞争条件,其他人会在您的检查和插入之间插入记录。依靠foreing键是一条路,那里的失败会通过异常反映出来。您可以针对这些竞争条件管理异常,但我仍然不建议将其用作应用程序逻辑。在这一点上,您基本上回到了最初的操作代码,作为最后的手段进行检查,只是事先进行一次毫无意义且低效的检查。在这种情况下,只要有外键,让DB爆炸并捕获异常是有意义的。不,这不是一个无意义的检查。异常处理涉及大量开销。读这个。然后在1000条记录上尝试这段代码,其中所有1000条记录都存在于DB中。异常是缓慢的是,但仅与其他C#代码相关。检查包括到服务器的第二次往返(包括所有相关的网络成本),而这比捕获异常要慢得多。由于我已将大部分插入逻辑移动到BLL,我现在想知道应该在哪里捕获异常?最符合逻辑的是UI层,因为我将根据异常更新UI,但是它会导致大量重复错误捕获。我还有一个UoW,所以我调用单个SaveChanges()。我可以用一种更简单的方法来检查重复代码的唯一性吗?因为我已经将大部分插入逻辑移到了BLL中,我现在想知道应该在哪里捕获异常?最符合逻辑的是UI层,因为我将根据异常更新UI,但是它会导致大量重复错误捕获。我还有一个UoW,所以我调用单个SaveChanges()。我可以用一种更简单的方法来检查重复代码的唯一性吗?