我正在使用,我需要在我的方法ADO.NET EF
中实现某种自定义回滚。Save()
逻辑是这样的
- 我有一个调用
OpenFileDialog
的第一步Save()
是检查是否有选定的图像以及是否有将选定的图像复制到新位置。 - 然后我设置实体的属性,包括图片名称(这是我选择首先复制图像的原因)并使用此方法检查是否没有重复唯一值:
HasDuplicatingEntity(entity)
- 如果复制过程顺利并且没有具有相同唯一值的实体,那么我保存实体本身:
Save(entity)
- 如果出现问题,
Save(entity)
我只需要删除以前复制的图像(如果有的话),就是这样。
实际的实现是这样的:
try
{
SaveImage();
if(HasDuplicatingEntity(entity))
{
//Show message to the user
return false;
}
Save(entity);
}
catch
{
//Log the exception and show message
//Delete the image if there is such
}
出现的问题是,如果我尝试使用所选图像保存新实体但HasDuplicatingEntity(entity)
返回 true。然后使用当前的逻辑,我只是向用户显示已经有一个具有相同唯一值的实体,然后只返回 false,在选择图像然后复制的情况下,我的文件系统中会留下一个未使用的图像.
这引出了我的确切问题。我有一个方法可以在出现问题时删除图像,但它在catch
子句中被调用。现在,当我看到在另一个地方可能需要删除图像时,我看到了两个选项 - 只需从以下位置调用该方法if
:
if(HasDuplicatingEntity(entity))
{
//Show message to the user
//Delete Image
return false;
}
这有点合乎逻辑,但除了方法调用之外,我有一些检查以确定是否确实存在复制的图像,因为图像不是必需的,这将导致几行重复代码。另一种选择是抛出异常并转到catch
我已经处理此问题的子句,但这意味着更改当前管理此情况的方式。这个确切的部分:
if(HasDuplicatingEntity(entity))
{
//Show message to the user
return false;
}
是继承的,我没有太多经验,所以我不想把好事变成坏事,所以我想知道哪种方法是处理这个问题的正确方法。