在Entity Framework 6中使用(重用)事务的最佳方法是什么?
用例:
如果我们有两种方法

public decimal Withdraw(string accNum, decimal amount)
{
    using (var db = new MyDbContext())
    {
        var query = from t in db.MoneyTransactions
                    where t.AccountNumber.Equals(accNum)
                    select t;
        MoneyTransaction mt = query.First();
        mt.Amount -= amount;
        db.SaveChanges();
    }
    return amount;
}

public void Put(string accNum, decimal amount)
{
    using (var db = new MyDbContext())
    {
        var query = from t in db.MoneyTransactions
                    where t.AccountNumber.Equals(accNum)
                    select t;
        MoneyTransaction mt = query.First();
        mt.Amount += amount;
        db.SaveChanges();
     }
}


我想单独使用此方法(例如,仅将钱存入帐户),并在一次交易中使用它们:

public void Transfer(string srcAcc, string destAcc, decimal amount)
{
    Withdraw(srcAcc,amount);
    Put(destAcc,amount);
}

最佳答案

查看Systems.Transactions程序集和名称空间。 (BCL的一部分)

然后,您可以执行以下操作:

using(var trans = new TransactionScope())
{
    Withdraw(srcAcc, amount);        // No changes needed to these
    Put(destAcc, amount);            //   two methods...

    trans.Complete();
}


System.Transactions将创建所谓的环境事务。这是一个存储在线程上的事务,任何ADO.NET,LINQ-to-SQL和Entity Framework DB操作都将使用外观查找此TransactionScope对象。

此事务在using块的末尾提交或回滚。
在TransactionScope对象上调用Complete()将触发数据库中的提交,而未调用Complete()则会回滚事务。

关于c# - Entity Framework 交易,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24853861/

10-12 03:51
查看更多