Entity Framework 6三层架构入门:创建数据访问层DAL
回顾
上次我们讲到了Model的创建,现在来了解什么是DAL。
DAL是针对Model的访问,可以这么说,Model是项目的逻辑操作对象,DAL就是最基本的方法;DAL直接访问数据库。也就是说,该层的好坏直接关系到项目的运行是否顺畅。所以,这次我们来看看该如何写一个好的DAL层。
基本的思想是,写一个BaseService类,把所有的操作都实现,在让其他的DAL层来继承它,再根据自己的实际情况来写别的方法。
基于此,我们会写一个带有异步操作,IQueryable的类,尽量用异步方法,以此来实现更高性能的操作。
在项目中点击“引用”,添加引用,我们需要Model层的对象,还需要EF和数据库的包,所以点击添加引用。
我们会用之前的BaseEntity类来做基本操作,同时,它是可销毁的,还是泛型的,而且可以申请对象,所以写以下代码:
public class BaseService<T> : IDisposable where T : BaseEntity, new()
我们会调用BaseEntity类来实现,应为Model都继承自它,所以也就可以调用所有的类了,今后的DAL类都继承它。
现在申请一个Context类来调用所有的Model,利用构造函数赋值:
protected readonly StudentContext _db;public BaseService(StudentContext db){_db = db;}
Context
类表示实体框架的数据库上下文,用于处理数据库中的提取、存储和更新 Model
类实例。
可以使用与模型关联的 DbContext 来执行以下操作:
- 编写和执行查询
- 将查询结果具体化为实体对象
- 跟踪对这些对象所做的更改
- 将对象更改保存回数据库
- 将内存中的对象绑定到 UI 控件
简单来说,就是用它访问所有的Model类。
要注意,我们要有一个可以销毁的方法——Dispose
public void Dispose(){_db.Dispose();}
现在,我们可以写关于创建的方法了。
关于所有的方法,我们可以用异步方法,也可以用IQueryable(本质上是一种树,包含了各种方法),
同时,我们安排一个bool开关,来实现是否异步,将数据分成一条条线程,逐渐实现数据的基本操作。
创建的方法用异步的,加一个bool来判断是否执行,在集合中取。
public async Task CreateAsync(T t, bool saved = true){_db.Set<T>().Add(t);if (saved)await _db.SaveChangesAsync();}
这里,当条件是真时,就调用系统方法。
保存的方法,调用异步的就可以了。
public async Task SaveAsync(T t, bool saved = true){await _db.SaveChangesAsync();}
关于编辑,我们需要改变数据状态,再来修改。
public async Task EditAsync(T t, bool saved = true){_db.Entry(t).State = System.Data.Entity.EntityState.Modified;if (saved){_db.Configuration.ValidateOnSaveEnabled = false;await _db.SaveChangesAsync();_db.Configuration.ValidateOnSaveEnabled = true;}}
对于保存,我们需要校验状态是否合法。
保存和编辑都需要改变bool值,调用EF系统函数就行。
Modified:对象已更改。
Entry() :获取实体对象的代理类。
public async Task SaveAsync(bool IsValid){if (!IsValid){_db.Configuration.ValidateOnSaveEnabled = false;await _db.SaveChangesAsync();_db.Configuration.ValidateOnSaveEnabled = true;return;}await _db.SaveChangesAsync();}
移除的方法基本思想:用Id找到对应的数据,然后将它的bool设为false,就不保存了。
public async Task RemoveAsync(Guid id, bool saved = true){T t = new T() { Id = id };_db.Entry(t).State = EntityState.Unchanged;t.IsRemove = true;if (saved)await SaveAsync(false);}
获取全部数据,需要AsNotracking()。用AsNotracking()查询后,如果有就把他赋值给一个实体,如果没有就new一个新实体 。这样的话,因为AsNotracking()没有把这个实体加到EF跟踪里面,EF就会认为这个实体在数据库不存在,就会把查询后的实体添加到数据库,但是实际情况是这个实体是存在于数据库里面的,这样就会报数据重复的错误。所以使用AsNotracking()只能用于查询,不能用于其他赋值的操作。
public IQueryable<T> GetAll(){return _db.Set<T>().AsNoTracking().Where(m => !m.IsRemove);}
所有没有被移除的就返回了。
关于查找某一个值,需要它的Id,要是所有的里面找到一个,就返回。
public async Task<T> GetOne(Guid id){return await GetAll().FirstOrDefaultAsync(m => m.Id == id);}
这是省去labmbda的写法。
public IQueryable<T> GetAll(Expression<Func<T, bool>> predicate){return GetAll().Where(predicate);}
排序方法,也是获取所有值,然后调用order方法。
public IQueryable<T> GetAll(Expression<Func<T, bool>> predicate, bool asc = true){var data = GetAll().Where(predicate);if (asc)return data.OrderBy(m => m.DateTime);return data.OrderByDescending(m => m.DateTime);}
做分页的方法,基本思想是获取所有值,然后跳过pageindex*pagesize,再获取。
public IQueryable<T> GetAll(Expression<Func<T, bool>> predicate, int pageindex, bool asc = true, int pagesize = 10){return GetAll(predicate, asc).Skip(pagesize * pageindex).Take(pagesize);}
关于DAL层的其他类,都继承自它,再写其他的方法,这样就方便得多了。现在,我们用base来实现基本的操作。
public class ClassService:BaseService<Class>{public ClassService():base(new StudentContext()) { }}
可以看到,BaseService里装着你想要处理的类,构造函数用base来获取数据,是通过Context来获取,这就和开头相呼应了。
现在,你已经实现了DAL层的基本功能了。
Entity Framework 6三层架构入门:创建数据访问层DAL相关推荐
- ASP.NET数据库访问系列教程01-概述篇 创建数据访问层(下)
ASP.NET数据库访问系列教程 本教程深入探讨了基于ASP.NET 2.0技术的数据库访问方法和模式.这些介绍非常简明,并且提供了一步步的指导和大量的截屏. 该系列教程包括: 概述篇 基础报表 主/ ...
- ASP.NET数据库访问系列教程01-概述篇 创建数据访问层(中)
ASP.NET数据库访问系列教程 本教程深入探讨了基于ASP.NET 2.0技术的数据库访问方法和模式.这些介绍非常简明,并且提供了一步步的指导和大量的截屏. 该系列教程包括: 概述篇 基础报表 主/ ...
- Entity Framework在三层架构中的使用
本系列的前3篇文章已经向大家介绍了如何使用Entity Framework4(以下简称EF4)创建数据库并进行增删改查操作,还介绍了存储过程的调用方法.在以前的例子中,我们没对代码进行分层,只是简单的 ...
- 项目架构开发:数据访问层之Cache
数据访问层简单介绍 数据访问层,提供整个项目的数据访问与持久化功能.在分层系统中所有有关数据访问.检索.持久化的任务,最终都将在这一层完成. 来看一个比较经典的数据访问层结构图 大概可以看出如下信息 ...
- ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发
为什么80%的码农都做不了架构师?>>> ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发 前言:本篇主要讲述数据访问层的开发, ...
- 数据访问层DAL的再次重构_3(转载)
原文链接 接着数据访问层DAL的再次重构_2_模块的自定义设置节我们继续实现,到这里,开始后台编码,经历了建立数据库.建表.存储过程.web.config的自定义配置节点后,我们来实现数据访问层的编码 ...
- ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出...
ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出 前言:首先给大家说声"对不起",因为自从打算写这系列的文章以来,得到大家很多的支持 ...
- Entity Framework技术系列之1:数据访问技术概述
前言 .NET Framework自2002年发布以来,已经历了十来个年头.相应的,.NET平台上的数据访问技术也在不断发展,从最基础的ADO.NET,到SqlHelper简单帮助类,到DAAB(Da ...
- 桥接模式的应用之三层架构中的业务逻辑层(BLL)与数据访问层(DAL)的解耦
各层的作用 ①用户界面层:只负责显示和采集用户操作. ②业务逻辑层:负责UI和DAL层之间的数据交换,是系统架构中体现核心价值的部分.它关注点主要集中在业务规则的制定.业务流程的实现和业务需求的有关系 ...
最新文章
- 动态修改页面Meta 标签 keywords description
- matlab实现二项分布
- matlab一致性检验程序,一致性检验的源程序.doc
- 非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了!
- ListDictionary:改进的OrderedDictionary
- Sound Studio for Mac - 音频编辑处理工具
- ASP .NET中一个可以用来大作文章的地方。
- matlab怎么实现循环码,利用Matlab实现循环码编码
- css3 呼吸的莲花_心肾呼吸法—莲花能量冥想*
- OpenWRT安装Home Assistant
- 版权符号©的输入方法
- 回溯算法 --- 例题6.最大团问题
- ONF代理执行董事Rick Bauer出走MEF
- nginx中配置不输入端口(指定地址)访问项目的方法
- EditText输入完成后自动关闭输入法
- 服务器(CentOS7)配置安装oracle12c(v12.2.0)
- 定义一个矩形类Rectangle:(知识点:对象的创建和使用)
- 普利姆(prim)算法与迪杰斯特拉(dijestella)算法
- 一款支持大恒相机、IDS相机、普通USB相机和机械手的标定工具
- 什么叫首充?关于流量卡首充的说明!
热门文章
- 可用于电子书阅读器的开源阅读器软件项目
- 【MATLAB】plot和fplot的区别
- 计算机电源可以改装,玩转电源:将电脑电源改成可调稳压电源的设计
- SUSE12安装SAP HANA 2.0内存数据库
- ios表格添加底纹_如何在Word中的表格单元格中添加底纹
- VC++的窗口句柄和窗口ID
- 杜教筛 (包括线筛) 莫比乌斯函数前缀和 欧拉函数前缀和 因数和函数前缀和 因子个数前缀和 ( 分析 )...
- 前端基础 CSS 第十一章 使用CSS样式表 ----暑假学习第七、八天
- 【开发教程1】疯壳·ARM功能手机-开发板上电教程
- 直流电机工作原理释义