1

谁能告诉我这是否可能。

我有一些代码允许用户上传/更改他们的图像,在更改发生之前,我在上传新图像之前从磁盘中删除默认/旧图像。

问题是如果删除或上传出现问题,我如何回滚两者以便返回原始图像。

我以为我可以使用 tranactionscope,但要么我没有正确使用它,要么它不适用于这种情况。

我发现的所有示例都涉及使用 2 次调用数据库,但我的代码只涉及一次调用,那就是更新。

//TODO check transactionscope works ok
using (var tran = new TransactionScope())
{
    //Delete old image before updating new image
    //123 bogus number to throw error
    var deleteOldImage = _igmpfu.DisplayProfileDetailsForUpdate("123")
                                .FirstOrDefault();

    if (Convert.ToString(deleteOldImage) != 
        "5bb188f0-2508-4cbd-b83d-9a5fe5914a1b.png")
    {
        DeleteOldImage(deleteOldImage);
    }

    //Insert new image
    var imageGuid = imageId + ".png";
    bool imageUrl = _iuma.UpdateAvatar(cookieId, imageGuid);

    if (imageUrl)
    {
        TempData["Message"] = "Image updated";
        return RedirectToAction("Index", "Members");
    }
    tran.Complete();
}

任何帮助新手的帮助将不胜感激

//------------------------

我一直在看电脑很久,我所要做的就是

var deleteOldImage = _igmpfu.DisplayProfileDetailsForUpdate("123").FirstOrDefault();
                        if (deleteOldImage != null)
                        {

                           code here for writing to disk
                        }

我花了很长时间试图解决这个问题,这就是我所要做的:-(

感谢大家的回复。

4

1 回答 1

0

只有当您使用的类知道如何加入事务时,您拥有的代码才会起作用。

您在处理文件时会遇到的主要问题是文件系统难以以事务方式处理。我会使用的方法是这样的:

  1. 使用不同的文件名将新文件保存在磁盘上。
  2. 使用新文件名更新数据库。
  3. 如果数据库更新成功,从磁盘中删除旧文件,如果没有从磁盘中删除新文件。
于 2013-09-12T21:36:33.133 回答