(精华)2020年8月19日 数据库设计 EF事务

#region SaveChanges自带事务
///1. Context 包含的能对数据库的操作肯定不是对一个表的操作;可以操作多个动作 
///2. SaveChanges以后,默认启动事务,会一次性提交对数据库的所有操作; 要么都成功  要么都失败
using (TencentClassRoomContext context = new TencentClassRoomContext())
{
    {
        var userlist = context.SysUsers.Where(a => a.Id > 3).ToList();
        var user = context.SysUsers.Find(5);
    }
    {
        Company adCompany001 = new Company()
        {
            Name = "测试一下公司0001"
        };
        context.Companies.Add(adCompany001);
        Company adCompany002 = new Company()
        {
            Name = "测试一下公司0002~~"
        };
        context.Companies.Add(adCompany002);
    }
    {
        SysLog updatlog = context.SysLogs.Find(1);
        updatlog.Introduction += "---ABCDEFG";
    }
    {
        SysLog removelog2 = context.SysLogs.Find(2);
        context.SysLogs.Remove(removelog2);
    }
    context.SaveChanges();
}
#endregion

#region EF执行sql 事务;
//1.SaveChanges
//2.dbContext.Database.BeginTransaction();
using (TencentClassRoomContext dbContext = new TencentClassRoomContext())
{
    {
        DbContextTransaction trans = null;
        try
        {
            trans = dbContext.Database.BeginTransaction();
            string sql = "Update [SysUser] Set Name='Richard-0001' WHERE Id=@Id";
            SqlParameter parameter = new SqlParameter("@Id", 1);
            dbContext.Database.ExecuteSqlCommand(sql, parameter);
            SysLog updatlog = dbContext.SysLogs.Find(1);
            updatlog.UserName = "————————";
            updatlog.Introduction += "---ABCDEFG";
            dbContext.SaveChanges();
            trans.Commit();//只有在BeginTransaction  Commit 的时候才会提交事务;
        }
        catch (Exception ex)
        {
            if (trans != null)
                trans.Rollback();
            throw ex;
        }
        finally
        {
            trans.Dispose();
        }
    }
}
#endregion

#region 分布式事务
using (TencentClassRoomContext dbContext1 = new TencentClassRoomContext())
using (TencentClassRoomContext dbContext2 = new TencentClassRoomContext())
{
    using (TransactionScope trans = new TransactionScope())
    {
        SysLog updatlog = dbContext1.SysLogs.Find(1);
        updatlog.UserName = "ABCDAAA————————";
        updatlog.Introduction += "---ABCDEFG";
        dbContext1.SaveChanges();
        SysLog updatlog2 = dbContext2.SysLogs.Find(1);
        updatlog2.UserName = "测试一下~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·";
        updatlog2.Introduction += "---ABCDEFG";
        dbContext2.SaveChanges(); 
        trans.Complete();// 事务:  只有正常执行完这句话 才能算全部完整
    }
    
}
#endregion

封装

public class UnitOfWork
{
    public static void Invoke(Action action)
    {
        TransactionScope transaction = null;
        try
        {
            transaction = new TransactionScope();
            action.Invoke();
            transaction.Complete();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            throw;
        }
    }
}

UnitOfWork.Invoke(() =>
{
    using (IUserCompanyService iUserCompanyService = new UserCompanyService(new JDDbContext()))
   {
        //增删改
   }
});

你可能感兴趣的:(数据库)