【问题标题】:Is it ok to rely on a try-catch in a CreateOrUpdate method for the Entity Framework?可以在实体框架的 CreateOrUpdate 方法中依赖 try-catch 吗?
【发布时间】:2009-03-13 17:20:18
【问题描述】:

这样做可以接受吗?首先尝试添加实体。如果添加失败,那也没关系,因为这意味着实体已经存在?

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

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# entity-framework exception exception-handling try-catch


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可能希望从 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 时才需要。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2013-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多