ASP.Net MVC OA项目笔记<三>
1.1.1 业务层和数据层之间加一个数据会话层,封装所有数据操作类实例的创建(工厂类)
工厂类是负责对象的创建
作用:将BLL和DAL解耦了,提供一个数据访问的统一访问点
数据会话层DBSession
业务层BLL通过数据会话层DBSession调用数据操作类的实例
1.1.2 CZBK.ItcastOA.DALFactory添加一个类 DBSession
并引用Model,IDAL,DAL
1.1.3 创建一个工厂类
1.1.4 一个业务可能涉及到对多张表的操作,这时候我希望只连一次数据库完成对多张表的操作,写一个保存的方法
先创建一个EF上下文操作类
1.1.5 要操作数据库连接对象,就必须引入EF,同之前一样,通过创建一个实体数据模型来引入EF
1.1.6 DBSession 提供一个工厂解耦,并提供一个保存的方法
/// <summary> /// 1.数据会话层:就是一个工厂类,负责完成所有数据操作类实例的创建,然后业务层通过数据会话层来获取要操作数据类的实例, /// 所以数据会话层将业务层和数据层解耦。 /// 2.在数据会话层中提供一个方法:完成所有数据的保存。 /// </summary> public class DBSession { OAEntities Db = new OAEntities(); private IUserInfoDal _UserInfoDal; public IUserInfoDal UserInfoDal { get { if(_UserInfoDal==null) { _UserInfoDal=new UserInfoDal(); } return _UserInfoDal; } set { _UserInfoDal = value; } } /// <summary> /// 一个业务中经常涉及到对多张表的操作,我们希望连接一次数据库,完成对这张表数据的操作,提高性能
/// 工作单元模式 /// </summary> /// <returns></returns> public bool SaveChanges() { return Db.SaveChanges() > 0; } }
1.2.1 数据层DAL的BaseDal中,SaveChanges就不要了,都注释掉
在数据层中进行操作都只是在EF打上相应的标记,执行SaveChages时才进行数据库保存,不注释的话没调一次方法就得连一次数据库
工作单元模式:连一次数据库,把多条数据一次性保存回数据库
public class BaseDal<T> where T : class, new() { OAEntities Db = new OAEntities(); /// <summary> /// 新增 /// </summary> /// <param name="entity"></param> /// <returns></returns> public T AddEntity(T entity) { Db.Set<T>().Add(entity);//DbSet<T> //Db.SaveChanges(); return entity; } /// <summary> /// 删除 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool DeleteEntity(T entity) { //追加到ef上,打上删除标记,再保存 Db.Entry<T>(entity).State = System.Data.Entity.EntityState.Deleted; //return Db.SaveChanges() > 0; return true; } /// <summary> /// 更新 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool EditEntity(T entity) { //追加到ef上,打上编辑标记,再保存 Db.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified; //return Db.SaveChanges() > 0; return true; } /// <summary> /// 查询过滤 /// </summary> /// <param name="whereLambda"></param> /// <returns></returns> public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda) { return Db.Set<T>().Where(whereLambda); } /// <summary> /// 分页 /// </summary> /// <typeparam name="s"></typeparam> /// <param name="pageIndex">页码</param> /// <param name="pageSize">每页数量</param> /// <param name="totalCount">总数</param> /// <param name="whereLambda">过滤条件</param> /// <param name="orderbyLambda">排序条件</param> /// <param name="isAsc"></param> /// <returns></returns> public IQueryable<T> PageLoadEntities<s>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> whereLambda, Expression<Func<T, s>> orderbyLambda, bool isAsc) { var temp = Db.Set<T>().Where(whereLambda); totalCount = temp.Count(); if (isAsc)//正序 { //列:pageIndex=3,pageSize=15 //正序排列后,跳过第3页前的数据(前2页*15),剩下的只读取15条 temp = temp.OrderBy<T, s>(orderbyLambda).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize); } else//倒序 { temp = temp.OrderByDescending<T, s>(orderbyLambda).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize); } return temp; } }