c# - Entity Framework 事务

标签 c# .net entity-framework

在 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 数据库操作都将使用查找此 TransactionScope 对象。

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

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

相关文章:

c# - 如何在调用 SmtpClient.Send() 之前知道域是错误的?

c# - 从 VS2010 WCF 服务应用程序获取 WSDL

c# - ASP NET MVC 3 - 如何首先使用两个表和 Database.Setinitializer 在代码中重置数据库?

c# - 如何使用 LINQ 从 sql 查询编写 linq 查询?

c# - 从内部 for 循环中中断封闭的 switch 语句?

c# - 如何从数组中提取 3 个随机值?

c# - C# 中的 Selenium Grid 与 Nunit 并行执行

c# - 如何从 visual studio 的颜色对话框中获取十六进制颜色代码?

.net - 我可以在 .NET 中使用 "System.Currency"吗?

entity-framework - 我可以让 Entity Framework (核心)迁移创建数据库脚本吗?