zoukankan      html  css  js  c++  java
  • ASP.Net MVC OA项目笔记<四>

    1.1.1 EF线程唯一

             

             在数据层中用到了EF的实例,在数据会话层也用到了,所以在一个请求中只能创建一个EF实例(线程内唯一对象),把它封装成工厂类

    1.1.2 为了防止相互引用,循环引用,所以这个工厂类要写在数据层DAL

             DAL新增类 DBContextFactory

     /// <summary>
        /// 负责创建EF数据操作上下文实例,必须保证线程内唯一
        /// </summary>
        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 BaseDal<T> where T : class, new()
        {
    
            //OAEntities Db = new OAEntities();
            DbContext Db = DBContextFactory.CreateDbContext();
    
            /// <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;
            }
        }

     /// <summary>
        /// 1.数据会话层:就是一个工厂类,负责完成所有数据操作类实例的创建,然后业务层通过数据会话层来获取要操作数据类的实例,
        /// 所以数据会话层将业务层和数据层解耦。
        /// 2.在数据会话层中提供一个方法:完成所有数据的保存。
        /// </summary>
        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;
                }
            }
    
            /// <summary>
            /// 一个业务中经常涉及到对多张表的操作,我们希望连接一次数据库,完成对这张表数据的操作,提高性能
            /// 工作单元模式
            /// </summary>
            /// <returns></returns>
            public bool SaveChanges()
            {
               return Db.SaveChanges() > 0;
            }
        }
  • 相关阅读:
    gitLab、docker
    Spring源码分析
    Tomcat堆内存分析
    Kafka入门一
    Java NIO
    spring注解
    websocket即时通讯
    pycharm安装dlib库
    python+opencv人脸识别是否戴口罩
    2021年暑假周总结1
  • 原文地址:https://www.cnblogs.com/VSMinos/p/9758767.html
Copyright © 2011-2022 走看看