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时才需要这样做