ASP.NET MVC - EF存储过程和文件上载。没有回滚

时间:2017-09-05 10:09:11

标签: asp.net-mvc entity-framework

当我使用插入存储过程并在ASP.NET MVC中上传文件时,我遇到了问题。

我的try-catch块中有三个部分:

  1. 生成文件名。
  2. 执行插入存储过程。
  3. 保存文件。
  4. 生成文件名,将该文件名插入数据库并保存具有该名称的文件。

    问题:

    如果执行插入存储过程成功文件保存失败,插入的行仍然会保留,导致没有照片的事件。

    如果我切换订单,首先保存文件然后插入数据库,问题仍然存在。如果文件保存成功插入失败,则会显示没有该事件的照片。

    示例代码(仅举例说明)。

    try
    {
        //Generate a new file name.
        var newFileName = Guid.NewGuid().ToString();
    
        //Execute stored procedore.
        Database.Insert_Event(newFileName, title, description, dateTime);
    
        //Save event photo.
        eventPhoto.SaveAs(newFileName);
    }
    catch (DataException exception)
    {
        //Exception message when executing insert SP.
    }
    catch (IOException exception)
    {
        //Exception message when saving file.
    }
    

    问题:

    如果文件保存失败,如何在使用存储过程插入时还原数据库插入,或者如果插入失败,如何还原文件保存?

1 个答案:

答案 0 :(得分:2)

最好的方法是首先保存文件然后插入数据库。

所以我在下面做的是将文件保存到新路径(newFileName)。如果文件未保存,则异常将在我们的catch语句中捕获。接下来,如果一切顺利,我们检查文件是否存在于新路径中,我们执行存储过程。

如果我们遇到错误就执行存储过程,它将被捕获到我们的catch语句中,并且没有数据插入到数据库中,我们将从新路径中删除该文件而不留下任何痕迹。

这将涵盖您的问题的两种情况。

    //Generate a new file name.
    var newFileName = Guid.NewGuid().ToString();
    try
    {    
        //Save event photo.
        eventPhoto.SaveAs(newFileName);

        //checks if file exists at the new path
        if(File.Exists(newFileName)){
            //Execute stored procedore.
            Database.Insert_Event(newFileName, title, description, dateTime);
        }
    }
    catch (DataException exception)
    {
        //Exception message when executing insert SP.
        // Remove the saved file
        if(File.Exists(newFileName)){
            File.Delete(newFileName)
        }
    }
    catch (IOException exception)
    {
        //Exception message when saving file.
    }