欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.Net MVC OA项目笔记<四>

程序员文章站 2022-05-13 21:41:17
1.1.1 EF线程唯一 在数据层中用到了EF的实例,在数据会话层也用到了,所以在一个请求中只能创建一个EF实例(线程内唯一对象),把它封装成工厂类 1.1.2 为了防止相互引用,循环引用,所以这个工厂类要写在数据层DAL DAL新增类 DBContextFactory 1.2.1 把BaseDal ......

 

1.1.1 ef线程唯一

         ASP.Net MVC OA项目笔记<四>

         在数据层中用到了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数据操作上下文实例改成 线程唯一的

         两种写法都可以

ASP.Net MVC OA项目笔记<四>

 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;
        }
    }

 

ASP.Net MVC OA项目笔记<四>

 

 /// <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;
        }
    }