可以在实体框架的 CreateOrUpdate 方法中依赖 try-catch 吗?
-
22-07-2019 - |
题
这样做可以接受吗?首先尝试添加实体。如果添加失败,也没关系,因为这意味着该实体已经存在?
或者有更优雅/简单的解决方案吗?
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语句的意思是“捕捉任何标准或非标准的例外”。但你的意图是为了防止重复添加。再添失败有多种这并不表明现有项目的原因。例如,该方法可以抛出一个空引用和你假设它加入。
如果您想检查重复添加,您必须在抛出一个重复添加只捕获异常。
其他提示
您想与IfExists样式的方法来开始,然后跳过保存更改,除非你确实有变化。
正如卢卡斯指出,的try-catch块有一个大的开销,如果你掉进catch块,所以一般你不想依赖,除非有确定的项目已经存在的没有可能的方式。
不要使用一个try-catch做一个if语句的工作。的try-catch为不寻常的意外事件。
修改强> 在你更新后的代码,你没有赶上,将通过“AddToXXXXXX”方法抛出的异常。
您应该做的。
If(!XXXXXX.Contains(newItemValue))
{
try
{
add...
savechanges...
}
catch
{
}
}
另外,你可以单独拿出来添加和调用SaveChanges成不同的try-catch块,但如果添加时的SaveChanges失败甚至被执行的才是必需的。
您可以用 If 语句替换第一个 Try-Catch,但我认为您仍然需要第二个。
编辑: 也不建议只捕获一个块中的所有异常,而不考虑它们是什么。
附:Try Catch 块比 If 语句使用更多的处理能力(时间)。
不隶属于 StackOverflow