2

我可能在这里使用了错误的术语(如果有人知道,我会喜欢正确的名称)但我经常遇到想要将某些内容保存到数据库+其他内容的问题。在我目前的情况下,我有以下代码。

public class Stock
{
    public Guid StockID { get; set; }        
    public string Name { get; set; }
    public byte[] Image { get; set; }
}

IEnumerable<Stock> stock = new StockService().Get();

using (Database db = DBFactory.Create())
{
    try
    {
        db.BeginTransaction();

        db.InsertAll(stock);

        foreach (Stock item in stock)
            IsolatedStorage.SaveFile(item.Name, item.Image);

        db.Commit();
    }
    catch
    {
        db.Rollback();
        throw;
    }
}

正如您所希望的那样,我正在做的是将某些内容保存到数据库(在我的情况下为 Sqlite)和 Windows Phone 设备上的 IsolatedStorage 中。

现在,如果上面显示的代码失败,它显然会导致IsolatedStorage不一致的状态。我可以修改此代码并从 catch 块中的 IsolatedStorage 中删除任何图像,如下所示:

catch (Exception ex)
{
    db.Rollback();
    foreach (Stock item in stock)
        IsolatedStorage.Delete(item.Name);

    throw;
}

但是我已经多次遇到这个问题,我不禁觉得必须有更好的方法。那么,当您想在事务中对数据库执行某些操作 + 执行其他操作时,是否有一些适用的模式?

4

1 回答 1

1

如果你把循环放在db.Commit();前面,那么任何错误都会在执行之前被捕获。只有成功时才会运行循环。foreachCommit()foreachCommit()foreach

于 2013-10-04T09:59:19.630 回答