Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架检测重复条目的更好方法_C#_Entity Framework - Fatal编程技术网

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()。我可以用一种更简单的方法来检查重复代码的唯一性吗?