实体框架事务
本文关键字:事务 框架 实体 | 更新日期: 2023-09-27 18:13:50
在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);
}
查看系统。事务程序集和名称空间。(BCL的一部分)
然后你可以这样做:
using(var trans = new TransactionScope())
{
Withdraw(srcAcc, amount); // No changes needed to these
Put(destAcc, amount); // two methods...
trans.Complete();
}
系统。事务将创建所谓的环境事务。这是存储在线程和任何ADO上的事务。. NET, LINQ-to-SQL和实体框架数据库操作将使用查找此TransactionScope
对象。
该事务在using
块结束时提交或回滚。在TransactionScope对象上调用Complete()
将触发数据库中的提交,而不调用Complete()
将回滚事务。
可以使用重载方法:
public void Put(string accNum, decimal amount, MyDbContext context)
{
var query = from t in context.MoneyTransactions
where t.AccountNumber.Equals(accNum)
select t;
MoneyTransaction mt = query.First();
mt.Amount += amount;
db.SaveChanges();
}
public void Put(string accNum, decimal amount)
{
using (var db = new MyDbContext())
{
Put(accNum, amount, db);
}
}
与Withdraw
方法相同。然后你可以写:
using (var db = new MyDbContext())
using (var tran = db.Database.BeginTransaction())
{
try
{
Withdraw(srcAcc, amount, db);
Put(destAcc, amount, db);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
多亏了重载方法,你不必重构其他现有的方法来应用新的参数(MyDbContext
)。