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 - ) * pageSize).Take<T>(pageSize);
}
else//倒序
{
temp = temp.OrderByDescending<T, s>(orderbyLambda).Skip<T>((pageIndex - ) * 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() > ;
}
}
ASP.Net MVC OA项目笔记<四>的更多相关文章
- ASP.Net MVC OA项目笔记<五>
1.1.1 抽象工厂封装数据操作类实例创建,然后DBSession调用抽象工厂,修改DBSession CZBK.ItcastOA.DALFactory数据会话层调数据层不能直接new,要封装一下解 ...
- ASP.Net MVC OA项目笔记<二>
1.1.0 创建数据层 1.1.1 CZBK.ItcastOA.IDAL 引用 CZBK.ItcastOA.Model 1.2.1 给IDAL添加一个接口IUserInfoDal 里面写增删改查分页的 ...
- ASP.Net MVC OA项目笔记<六>
1.1.1 开始写业务,先写业务的实现再写业务的接口 业务类中也是有写增删改查公用的方法 引用Model,IDAL,DALFactory BLL添加两个类 UserInfoService,BaseSe ...
- ASP.Net MVC OA项目笔记<三>
1.1.1 业务层和数据层之间加一个数据会话层,封装所有数据操作类实例的创建(工厂类) 工厂类是负责对象的创建 作用:将BLL和DAL解耦了,提供一个数据访问的统一访问点 数据会话层DBSession ...
- ASP.Net MVC OA项目笔记<一>
1.1.1 新建空白解决方案CZBK.ItcastOA 1.2.1 添加类库 1.2.2 同上添加多个类库 生成的 class1.cs先不用删除,删了的后,后面可能没办法直接点引用 1.3.1 添加表 ...
- ASP.NET MVC企业级项目框架
ASP.NET MVC企业级项目框架 MVC项目搭建笔记---- 项目框架采用ASP.NET MVC+Entity Framwork+Spring.Net等技术搭建,搭建过程内容比较多,结合了抽象工厂 ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- ASP.NET MVC搭建项目后台UI框架—1、后台主框架
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询
ASP.NET MVC搭建项目后台UI框架—1.后台主框架 需求:在查询记录的时候,输入第一个字,就自动把以这个字开头的相关记录查找出来,输入2个字就过滤以这两个子开头的记录,依次类推. 突然要用到这 ...
随机推荐
- 基于centos6.5 hadoop 伪分布式安装
步骤1:修改IP 地址和主机名: vi /etc/sysconfig/network-scripts/ifcfg-eth0 如果该文件打开为空白文件代表你计算机上的网卡文件不是这个名称“ifcfg-e ...
- applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
14:59:16,747 ERROR ContextLoader:350 - Context initialization failedorg.springframework.beans.factor ...
- socketserver实例化过程
一.创建server对象时__init__的执行 找继承中的__init__ 这是ThreadingMixIn类中的方法 这是TCPServer类中的方法(父类BaserServer中还会用到fini ...
- 2019.01.20 bzoj2238: Mst(kruskal+树链剖分)
传送门 树链剖分菜题. 题意简述:给一个无向图,边有边权,每次询问删一条边(对后面的询问无影响)之后的最小生成树. 思路: 先跑一次kruskalkruskalkruskal并把跑出来的最小生成树给链 ...
- Query - noConflict() 方法
ps:菜鸟教程 如何在页面上同时使用 jQuery 和其他框架? noConflict() 方法会释放对 $ 标识符的控制,这样其他脚本就可以使用它了. 当然,您仍然可以通过全名替代简写的方式来使用 ...
- 关于页面传值页面的跳转,以及spring mvc 框架的流程问题
list页面 1.点击页面后,进入后台的list方法中,通过findPage()查询数据的,findPage中含有findList(): 2.如果页面没有输入查询条件,那么则显示所有数据集合,如果页面 ...
- (14)Why some people find exercise harder than others
https://www.ted.com/talks/emily_balcetis_why_some_people_find_exercise_harder_than_others/transcript ...
- DevExpress 只允许修改指定列
gridView1.OptionsBehavior.Editable = true; gridView1.OptionsBehavior.ReadOnly = false; foreach (Grid ...
- C++IO cin
cin cin.get() 每次只读缓冲区一个字符,不能接收空格 cin.getline() 读缓冲区一行,能够接收空格 cin.ignore(2) 忽略缓冲器2个字节 int i = cin.pee ...
- vim 查找替换批量替换
一.vi查找: 当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢?在vi里可没有菜单-〉查找, 不过没关系,你在命令模式下敲斜杆(/)这时在状态栏(也就是屏幕左下脚)就出 ...