2

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

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

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

3 回答 3

7

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

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

于 2009-03-13T17:22:23.047 回答
1

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

于 2009-03-13T17:27:00.447 回答
0

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

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

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

于 2009-03-13T17:23:23.013 回答