public class EFTransaction:ITransaction { DbContextTransaction originalTransaction = null; MyDbContext myDbContext = null; /// <summary> /// 默认构造函数 /// </summary> public EFTransaction() { myDbContext= DbContextHelper.MainDbContextFactory.GetDbContext(AccessMode.Write); originalTransaction = myDbContext.Database.CurrentTransaction; } /// <summary> /// 构造函数 /// </summary> public EFTransaction(IDbContextFactory factory) { myDbContext= factory.GetDbContext(AccessMode.Write); originalTransaction = myDbContext.Database.CurrentTransaction; } /// <summary> /// 开始事务 /// </summary> public void BeginTransaction() { MyDbContext dbContext = myDbContext; if (originalTransaction == null) { dbContext.Database.BeginTransaction(); } ThreadTransaction.SetTransactionFlag(true); } /// <summary> /// 提交一个事务 /// </summary> /// <returns></returns> public int Commit() { int result = 0; if (originalTransaction == null) { result += myDbContext.SaveChanges(); ThreadTransaction.SetTransactionFlag(false); DbContextTransaction transaction = myDbContext.Database.CurrentTransaction; if (transaction != null) { transaction.Commit(); transaction.Dispose(); result += 1; } } return result; } /// <summary> /// 回滚一个事务 /// </summary> public void Rollback() { if (originalTransaction == null) { ThreadTransaction.SetTransactionFlag(false); DbContextTransaction transaction = myDbContext.Database.CurrentTransaction; if (transaction != null) { transaction.Rollback(); transaction.Dispose(); } } else { throw new Exception("嵌套内部事务异常"); } } }
支持嵌套事务
使用示例:
public static TResult AddTest0() { BookDAL testdal = DALFactory.CreateDAL<BookDAL>(); Framework.DataAccess.EFTransaction Transaction = new Framework.DataAccess.EFTransaction(); Transaction.BeginTransaction(); try { testdal.Insert(new Book { NAME="c#1234" }); Transaction.Commit(); } catch (Exception ex) { Transaction.Rollback(); } var ss= testdal.GetList(); return null; }