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线程唯一
在数据层中用到了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; } }
上一篇: 从四个层面改善机器人发展中存在的问题
下一篇: 幽默的老年人
推荐阅读
-
asp.net core项目mvc权限控制:分配权限
-
详解ASP.NET MVC之下拉框绑定四种方式
-
ASP.NET MVC下的四种验证编程方式[续篇]
-
ASP.NET MVC 主要的四种过滤器和三种具体实现类
-
ASP.NET MVC Model绑定(四)
-
MVC项目结构搭建及单个类的实现学习笔记1
-
ASP.NET MVC项目实现BasePage基类用作ASPX.CS网页继承
-
ASP.NET MVC项目中App_Code目录在程序应用
-
asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFactory,DALMsSql'.
-
把ASP.NET MVC项目部署到本地IIS上的完整步骤