这样做是否可以接受?首先尝试添加实体。如果添加失败,则无关紧要,因为这意味着实体已存在?
或者是否有更优雅/更简单的解决方案?
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;
}
答案 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语句使用更多的处理能力(时间)。