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层之间的数据交换,是系统架构中体现核心价值的部分.它关注点主要集中在业务规则的制定.业务流程的实现和业务需求的有关系 ...
最新文章
- 推荐一个工作流自动化工具
- [转]查询oracle数据库的数据库名、实例名、ORACLE_SID
- Python3 图片(jpg、bmp、png)转PDF
- Codeforces 671E Organizing a Race (贪心、线段树)
- SGU 160.Magic Multiplying Machine
- 逆水寒最新的服务器7月12日,《逆水寒》7月12日更新内容一览
- Mr.J--正则表达式
- php 实现二叉树的最大深度_LeetCode题记——104二叉树的最大深度
- 5个让前端代码变得简洁的最佳实践
- Tcl Tutorial 笔记1 · 输出
- 安卓微信本地数据库解密与删除聊天记录恢复 EnMicroMsg.db FTS5IndexMicroMsg_encrypt.db
- android标题栏尺寸,Android平台设计规范19条(轻松入门)
- python期货基本面分析_Python股票期货交易利器,砖型图详细绘制教程!
- MYSQL命令大全自学笔记
- 远程办公实践丨需重视以人为本的员工激励设计
- Linux 离线安装 autoformat
- python 10行代码生成词云图片(基础词云、形状词云)
- 个人支付宝/微信/云闪付/商户聚合码/银行卡等到账通知常用技术方案总结
- 移动端自适应解决方法小结
- 夺命雷公狗---DEDECMS----21dedecms按照地区取出电影内容
热门文章
- Android备份到电脑,用 TWRP「一键 Ghost」你的 Android 手机,还能备份到电脑
- 数学计算机教学课题,《运用信息技术,优化数学课堂教学》课题方案.doc
- springboot+vue图片上传显示
- superset 1.3 地图 汉字 展示,省市编码 ISO3166
- VS Code保存文件时自动删除行尾空格
- 最新最全python镜像源-(转)
- PT与PX,em(%)区别
- 小丸子学Hadoop系列之——hbase备份与恢复
- 苹果手机计算机隐藏照片app,App Store 上的“加密计算器 - 隐藏私人相册视频”...
- 不知道怎么把PDF文档转Word?来看看这几个好用的PDF转Word软件