Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 在实体框架的CreateOrUpdate方法中依赖try-catch可以吗?_C#_Entity Framework_Exception_Exception Handling_Try Catch - Fatal编程技术网

C# 在实体框架的CreateOrUpdate方法中依赖try-catch可以吗?

C# 在实体框架的CreateOrUpdate方法中依赖try-catch可以吗?,c#,entity-framework,exception,exception-handling,try-catch,C#,Entity Framework,Exception,Exception Handling,Try Catch,这样做可以接受吗?首先尝试添加实体。如果添加失败,这并不重要,因为这意味着实体已经存在 还是有更优雅/简单的解决方案 EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel(); try { dal.AddToXXXXXX(xxxxxxx); } catch { } try { dal.SaveChanges(); return true; } catch { return

这样做可以接受吗?首先尝试添加实体。如果添加失败,这并不重要,因为这意味着实体已经存在

还是有更优雅/简单的解决方案

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();

try
{
    dal.AddToXXXXXX(xxxxxxx);
}
catch
{

}

try
{
    dal.SaveChanges();
    return true;
}
catch
{
    return false;
}
好的,我把它缩短为

EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();

if(xxxxxxx.ID == 0)
{
    dal.AddToXXXXXX(xxxxxxx);
}

try
{
    dal.SaveChanges();
    return true;
}
catch
{
    return false;
}

这样做肯定是不合适的。C#中没有类型的catch语句表示“捕获任何标准或非标准异常”。但您的目的是防止重复添加。添加可能由于各种原因而失败,这些原因并不表示现有条目。例如,该方法可能会抛出一个空引用,您可能会假设它已添加


如果要检查重复添加,则必须只捕获为重复添加引发的异常

您可以用If语句替换第一个Try-Catch,但我认为您仍然需要第二个

编辑:也不建议只捕获一个块中的所有异常,而不考虑它们是什么

附言。
Try Catch块比If语句使用更多的处理能力(时间)。

您可能希望从IfExists样式方法开始,然后跳过保存更改,除非您确实有更改

正如Lucas所指出的,如果您落入catch块中,try catch块的开销很大,因此通常您不希望依赖于此,除非无法确定该项是否已经存在

不要使用try-catch来完成If语句的工作。Try catch用于不寻常的意外事件

编辑 在更新的代码中,您无法捕获将由“AddToXXXXXX”方法引发的异常

你应该这样做

If(!XXXXXX.Contains(newItemValue))
{
   try
   {
      add...
      savechanges...
   }
   catch
   {

   }
}
或者,您可以将Add和Savechanges分离到不同的try-catch块中,但只有在Add失败时执行Savechanges时才需要这样做