O/RM EF6(3) Context生命周期多种事务 IEnumerable和IQueryable的区别 TransactionScope 级联删除
1, Context生命周期,多种事务
Content实例
能不能整个进程就一个context实例呀? 1,不行content相当占用资源 2,SaveChange 本身是一种事务一次性可以执行多条操纵
那每个数据操作都去来个context实例? 1 内存消耗大,没法缓存 2 多context实例 join 不行,因为上下文环境不一样;除非把数据都查到内存,再去linq 3 多context的事务也麻烦点
1.1 多个数据修改,一次SaveChange,开始事务保存
1 #region 多个数据修改,一次SaveChange,开始事务保存 2 //using (JDDbContext dbContext = new JDDbContext()) 3 //{ 4 // User userNew = new User() 5 // { 6 // Account = "Admin", 7 // State = 0, 8 // CompanyId = 4, 9 // CompanyName = "万达集团", 10 // CreateTime = DateTime.Now, 11 // CreatorId = 1, 12 // Email = "57265177@qq.com", 13 // LastLoginTime = null, 14 // LastModifierId = 0, 15 // LastModifyTime = DateTime.Now, 16 // Mobile = "18664876671", 17 // Name = "yoyo", 18 // Password = "12356789", 19 // UserType = 1 20 // }; 21 // dbContext.Users.Add(userNew); 22 23 // User user17 = dbContext.Users.FirstOrDefault(u => u.Id == 17); 24 // user17.Name += "aaa"; 25 26 // User user18 = dbContext.Set<User>().Find(18); 27 // user18.Name += "bbb"; 28 29 // Company company2019 = dbContext.Set<Company>().Find(2019); 30 // dbContext.Companies.Remove(company2019); 31 32 // dbContext.SaveChanges(); 33 //} 34 #endregion
1.2 多个数据操作一次savechange,任何一个失败直接全部失败
1 #region 多个数据操作一次savechange,任何一个失败直接全部失败 2 //using (JDDbContext dbContext = new JDDbContext()) 3 //{ 4 // User userNew = new User() 5 // { 6 // Account = "Admin", 7 // State = 0, 8 // CompanyId = 4, 9 // CompanyName = "万达集团", 10 // CreateTime = DateTime.Now, 11 // CreatorId = 1, 12 // Email = "57265177@qq.com", 13 // LastLoginTime = null, 14 // LastModifierId = 0, 15 // LastModifyTime = DateTime.Now, 16 // Mobile = "18664876671", 17 // Name = "yoyo", 18 // Password = "12356789", 19 // UserType = 1 20 // }; 21 // dbContext.Users.Add(userNew); 22 23 // User user17 = dbContext.Users.FirstOrDefault(u => u.Id == 17); 24 // user17.Name += "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 25 26 // User user18 = dbContext.Set<User>().Find(18); 27 // user18.Name += "bbb"; 28 29 // //Company company2019 = dbContext.Set<Company>().Find(2019); 30 // //dbContext.Companies.Remove(company2019); 31 32 // dbContext.SaveChanges(); 33 //} 34 #endregion
2,IEnumerable和IQueryable 的区别
在显示上两者的相差无几合适在使用上相差却很大
IEnumerable 使用大多是ToObject 迭代器使用的是yield 没事使用的时候才会去加载
IQueryable 更多的使用是ToSQL
楼上是IEnumerable类型,数据其实已经在内存里,有个迭代器的实现,用的是委托
楼下的IQueryable类型,数据在数据库里面,这个list里面有表达式目录树---返回值类型--IQueryProvider(查询的支持工具,sqlserver语句的生成)
其实userList只是一个包装对象,里面有表达式目录树,有结果类型,有解析工具,还有上下文,真需要数据的时候才去解析sql,执行sql,拿到数据的---因为表达式目录树可以拼装;
2.1IEnumerable类型
1 { 2 List<int> intList = new List<int>() { 123, 4354, 3, 23, 3, 4, 4, 34, 34, 3, 43, 43, 4, 34, 3 }; 3 var list = intList.Where(i => 4 { 5 Thread.Sleep(i); 6 return i > 10; 7 });//没有过滤 8 foreach (var i in list)//才去过滤 9 { 10 Console.WriteLine(i); 11 } 12 Console.WriteLine("*********************"); 13 //这里是延迟的,利用的是迭代器的方式,每次去迭代访问时,才去筛选一次,委托+迭代器 14 }
2.2IQueryable类型
1 { 2 using (JDDbContext dbContext = new JDDbContext()) 3 { 4 var userList = dbContext.Set<User>().Where(u => u.Id > 10);//这里的的本身是没有像操作数据库的 IQueryProvider SQL语句的生生成 5 6 foreach (var user in userList) //这里才会使用sql到数据库中去查询 7 { 8 Console.WriteLine(user.Name); 9 } 10 } 11 }
3事务问题 TransactionScope
注意事项 1 :需要引用 using System.Transactions;

2 实例 TransactionScope
1 //using (JDDbContext dbContext = new JDDbContext()) 2 //{ 3 // using (TransactionScope trans = new TransactionScope())//实例 TransactionScope 4 // { 5 // User userNew1 = new User() 6 // { 7 // Account = "Admin", 8 // State = 0, 9 // CompanyId = 2031, 10 // CompanyName = "软谋", 11 // CreateTime = DateTime.Now, 12 // CreatorId = 1, 13 // Email = "57265177@qq.com", 14 // LastLoginTime = null, 15 // LastModifierId = 0, 16 // LastModifyTime = DateTime.Now, 17 // Mobile = "18664876671", 18 // Name = "民工甲123333333", 19 // Password = "12356789", 20 // UserType = 1 21 // }; 22 // dbContext.Set<User>().Add(userNew1); 23 // dbContext.SaveChanges(); 24 25 // SysLog sysLog = new SysLog() 26 // { 27 // CreateTime = DateTime.Now, 28 // CreatorId = userNew1.Id, 29 // LastModifierId = 0, 30 // LastModifyTime = DateTime.Now, 31 // Detail = "12345678", 32 // Introduction = "sadsfghj", 33 // LogType = 1, 34 // UserName = "zhangsanan2zhangsanan2zhangsanan2zhangsanan2zhangsanan2zhangsanan2" 35 // }; 36 // dbContext.Set<SysLog>().Add(sysLog); 37 // dbContext.SaveChanges(); 38 39 // trans.Complete();//能执行这个,就表示成功了; 40 // } 41 //}
1 using (JDDbContext dbContext1 = new JDDbContext()) 2 using (JDDbContext dbContext2 = new JDDbContext()) 3 { 4 using (TransactionScope trans = new TransactionScope()) 5 { 6 User userNew1 = new User() 7 { 8 Account = "Admin", 9 State = 0, 10 CompanyId = 2031, 11 CompanyName = "软谋", 12 CreateTime = DateTime.Now, 13 CreatorId = 1, 14 Email = "57265177@qq.com", 15 LastLoginTime = null, 16 LastModifierId = 0, 17 LastModifyTime = DateTime.Now, 18 Mobile = "18664876671", 19 Name = "民工甲123333333", 20 Password = "12356789", 21 UserType = 1 22 }; 23 dbContext1.Set<User>().Add(userNew1); 24 dbContext1.SaveChanges(); 25 26 SysLog sysLog = new SysLog() 27 { 28 CreateTime = DateTime.Now, 29 CreatorId = userNew1.Id, 30 LastModifierId = 0, 31 LastModifyTime = DateTime.Now, 32 Detail = "12345678", 33 Introduction = "sadsfghj", 34 LogType = 1, 35 UserName = "zhangsanan2zhangsanan2zhangsanan2zhangsanan2333333333" 36 }; 37 dbContext2.Set<SysLog>().Add(sysLog); 38 dbContext2.SaveChanges(); 39 40 trans.Complete();//能执行这个,就表示成功了; 41 } 42 }
3级联删除
其实在我的认知里面,SQL的主外键关系,只要你写sql运行删除主键是不能完成的会报出错误意思是说你还有外键没有删除,按照常规删除我们要 从 子--主这样的顺序一条一条删除的,在EF6当中好像可以直接删除主表中的外键关联字段,并且可以将子集
全部删除
1 /// <summary> 2 /// 针对主外键 3 /// 级联删除:主表数据删除后,子表是删除/不变/改成默认值&null 4 /// 级联更新:应该用不上, 5 /// </summary> 6 public static void ShowDelete() 7 { 8 //1 数据库设置级联删除 只需要删除主表 9 //2 如果没有级联删除--而且lazyload为false--还得数据库允许外键不存在--就可以只删除主表 10 //3 其实工作中这种已经很少见了,大部分数据都是假删除的,搞个状态 11 int id = 0; 12 using (JDDbContext dbContext = new JDDbContext()) 13 { 14 Company company = new Company() 15 { 16 Name = "软谋教育高级班12222", 17 CreateTime = DateTime.Now, 18 CreatorId = 1, 19 LastModifierId = 0, 20 LastModifyTime = DateTime.Now, 21 }; 22 User userNew1 = new User() 23 { 24 Account = "Admin", 25 State = 0, 26 CompanyId = company.Id, 27 CompanyName = company.Name, 28 CreateTime = DateTime.Now, 29 CreatorId = 1, 30 Email = "57265177@qq.com", 31 LastLoginTime = null, 32 LastModifierId = 0, 33 LastModifyTime = DateTime.Now, 34 Mobile = "18664876671", 35 Name = "民工甲12222", 36 Password = "12356789", 37 UserType = 1 38 }; 39 User userNew2 = new User() 40 { 41 Account = "Admin", 42 State = 0, 43 CompanyId = company.Id, 44 CompanyName = company.Name, 45 CreateTime = DateTime.Now, 46 CreatorId = 1, 47 Email = "57265177@qq.com", 48 LastLoginTime = null, 49 LastModifierId = 0, 50 LastModifyTime = DateTime.Now, 51 Mobile = "18664876671", 52 Name = "逐梦12222", 53 Password = "12356789", 54 UserType = 2 55 }; 56 dbContext.Set<User>().Add(userNew1); 57 dbContext.Set<User>().Add(userNew2); 58 dbContext.Set<Company>().Add(company); 59 dbContext.SaveChanges(); 60 61 id = company.Id; 62 } 63 using (JDDbContext dbContext = new JDDbContext()) 64 { 65 dbContext.Configuration.LazyLoadingEnabled = false; 66 Company company = dbContext.Companies.Find(id); 67 dbContext.Set<Company>().Remove(company); 68 dbContext.SaveChanges();//只删除company,没有删除user+没有级联删除,主表删除了,但是子表还在,子表的外键id不存在了。。 69 } 70 }

浙公网安备 33010602011771号