1.1.1 EF线程唯一
在数据层中用到了EF的实例,在数据会话层也用到了,所以在一个请求中只能创建一个EF实例(线程内唯一对象),把它封装成工厂类
1.1.2 为了防止相互引用,循环引用,所以这个工厂类要写在数据层DAL
DAL新增类 DBContextFactory
////// 负责创建EF数据操作上下文实例,必须保证线程内唯一 /// public class DBContextFactory { public static DbContext CreateDbContext() { //从CallContext从读取dbContext DbContext dbContext = (DbContext)CallContext.GetData("dbContext"); //如果CallContext中的dbContext是null的,说明是第一次创建 if (dbContext==null) { dbContext = new OAEntities();//创建一个新的EF上下文实例 CallContext.SetData("dbContext", dbContext);//把dbContext存进CallContext中,以备下次使用 } return dbContext; } }
1.2.1 把BaseDal和DBSession中的EF数据操作上下文实例改成 线程唯一的
两种写法都可以
public class BaseDalwhere T : class, new() { //OAEntities Db = new OAEntities(); DbContext Db = DBContextFactory.CreateDbContext(); /// /// 新增 /// /// ///public T AddEntity(T entity) { Db.Set ().Add(entity);//DbSet //Db.SaveChanges(); return entity; } /// /// 删除 /// /// ///public bool DeleteEntity(T entity) { //追加到ef上,打上删除标记,再保存 Db.Entry (entity).State = System.Data.Entity.EntityState.Deleted; //return Db.SaveChanges() > 0; return true; } /// /// 更新 /// /// ///public bool EditEntity(T entity) { //追加到ef上,打上编辑标记,再保存 Db.Entry (entity).State = System.Data.Entity.EntityState.Modified; //return Db.SaveChanges() > 0; return true; } /// /// 查询过滤 /// /// ///public IQueryable LoadEntities(Expression > whereLambda) { return Db.Set ().Where(whereLambda); } /// /// 分页 /// ////// 页码 /// 每页数量 /// 总数 /// 过滤条件 /// 排序条件 /// /// public IQueryable PageLoadEntities (int pageIndex, int pageSize, out int totalCount, Expression> whereLambda, Expression > orderbyLambda, bool isAsc) { var temp = Db.Set ().Where(whereLambda); totalCount = temp.Count(); if (isAsc)//正序 { //列:pageIndex=3,pageSize=15 //正序排列后,跳过第3页前的数据(前2页*15),剩下的只读取15条 temp = temp.OrderBy (orderbyLambda).Skip ((pageIndex - 1) * pageSize).Take (pageSize); } else//倒序 { temp = temp.OrderByDescending (orderbyLambda).Skip ((pageIndex - 1) * pageSize).Take (pageSize); } return temp; } }
////// 1.数据会话层:就是一个工厂类,负责完成所有数据操作类实例的创建,然后业务层通过数据会话层来获取要操作数据类的实例, /// 所以数据会话层将业务层和数据层解耦。 /// 2.在数据会话层中提供一个方法:完成所有数据的保存。 /// public class DBSession { //OAEntities Db = new OAEntities(); public DbContext Db { get { return DBContextFactory.CreateDbContext(); } } private IUserInfoDal _UserInfoDal; public IUserInfoDal UserInfoDal { get { if(_UserInfoDal==null) { _UserInfoDal=new UserInfoDal(); } return _UserInfoDal; } set { _UserInfoDal = value; } } ////// 一个业务中经常涉及到对多张表的操作,我们希望连接一次数据库,完成对这张表数据的操作,提高性能 /// 工作单元模式 /// ///public bool SaveChanges() { return Db.SaveChanges() > 0; } }