可以在Entity Framework的CreateOrUpdate方法中依赖try-catch吗?

时间:2009-03-13 17:20:18

标签: c# entity-framework exception exception-handling try-catch

这样做是否可以接受?首先尝试添加实体。如果添加失败,则无关紧要,因为这意味着实体已存在?

或者是否有更优雅/更简单的解决方案?

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;
}

3 个答案:

答案 0 :(得分:7)

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

如果要检查重复添加,必须仅捕获重复添加引发的异常。

答案 1 :(得分:1)

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

如Lucas所述,如果你陷入catch块,try-catch块会有很大的开销,所以通常你不想依赖它,除非没有办法确定该项是否已经存在。< / p>

不要使用try-catch来执行If语句的工作。 Try-catch适用于不常见的意外事件。

修改 在更新的代码中,您无法捕获“AddToXXXXXX”方法引发的异常。

你应该做

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

   }
}

或者,您可以将Add和Savechanges分离到不同的try-catch块中,但只有在SaveChanges执行时才需要执行,即使Add失败也是如此。

答案 2 :(得分:0)

你可以用If语句替换第一个Try-Catch,我想你仍然想要第二个。

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

P.S。 尝试Catch块比If语句使用更多的处理能力(时间)。