从数据库和文件系统中删除文件

wog*_*les 13 c# entity-framework file

我有一个表引用我们网络上共享位置的文件(将文件路径存储在数据库中).

我有一个按钮需要删除数据库中的记录和文件系统中的文件:

foreach (var report in reports)
{
      string filePath = report.ReportPath;

      if (File.Exists(filePath));
      {
         File.Delete(filePath);
      }                      

      context.ReportGenerations.DeleteObject(report);
      context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

删除文件或删除数据库记录时可能会抛出异常,如果发生这种情况,我希望这两个操作都不会完成.

有没有一种简单的方法可以确保两个操作都成功完成?

Cla*_*edi 21

你必须做两件事

  • 将整个过程包装在数据库事务中.

  • 从文件系统执行之前从数据库中删除文件

如果进程无法从数据库中删除,则不会删除物理文件,因为您尚未访问文件系统删除逻辑.

如果进程无法从文件系统中删除,则会回滚事务并恢复数据库操作.

DbTransaction transaction = null;
foreach (var report in reports)
{
    try
    {
        transaction = context.Connection.BeginTransaction();

        context.ReportGenerations.DeleteObject(report);
        context.SaveChanges();

        string filePath = report.ReportPath;
        if (File.Exists(filePath));
        {
            File.Delete(filePath);
        }
        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
    }
}        
Run Code Online (Sandbox Code Playgroud)


虽然我认为这是一种更安全的方法,但您可以实现并不会变得非常复杂,我同意没有同步方法可以保证100%的功效.为了确保没有孤儿项目,您必须实施后台清理过程.根据您的情况,您将不得不分析这种额外的复杂性是否合理.

  • 它确实很重要:如果您先执行文件,然后数据库调用失败,那么如何"回滚"文件删除?如果首先执行数据库调用,则可以在发现删除文件失败时将其回滚. (2认同)