回顾

上次我们讲到了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相关推荐

  1. ASP.NET数据库访问系列教程01-概述篇 创建数据访问层(下)

    ASP.NET数据库访问系列教程 本教程深入探讨了基于ASP.NET 2.0技术的数据库访问方法和模式.这些介绍非常简明,并且提供了一步步的指导和大量的截屏. 该系列教程包括: 概述篇 基础报表 主/ ...

  2. ASP.NET数据库访问系列教程01-概述篇 创建数据访问层(中)

    ASP.NET数据库访问系列教程 本教程深入探讨了基于ASP.NET 2.0技术的数据库访问方法和模式.这些介绍非常简明,并且提供了一步步的指导和大量的截屏. 该系列教程包括: 概述篇 基础报表 主/ ...

  3. Entity Framework在三层架构中的使用

    本系列的前3篇文章已经向大家介绍了如何使用Entity Framework4(以下简称EF4)创建数据库并进行增删改查操作,还介绍了存储过程的调用方法.在以前的例子中,我们没对代码进行分层,只是简单的 ...

  4. 项目架构开发:数据访问层之Cache

    数据访问层简单介绍 数据访问层,提供整个项目的数据访问与持久化功能.在分层系统中所有有关数据访问.检索.持久化的任务,最终都将在这一层完成. 来看一个比较经典的数据访问层结构图 大概可以看出如下信息 ...

  5. ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发

    为什么80%的码农都做不了架构师?>>>    ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发          前言:本篇主要讲述数据访问层的开发, ...

  6. 数据访问层DAL的再次重构_3(转载)

    原文链接 接着数据访问层DAL的再次重构_2_模块的自定义设置节我们继续实现,到这里,开始后台编码,经历了建立数据库.建表.存储过程.web.config的自定义配置节点后,我们来实现数据访问层的编码 ...

  7. ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出...

    ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出 前言:首先给大家说声"对不起",因为自从打算写这系列的文章以来,得到大家很多的支持 ...

  8. Entity Framework技术系列之1:数据访问技术概述

    前言 .NET Framework自2002年发布以来,已经历了十来个年头.相应的,.NET平台上的数据访问技术也在不断发展,从最基础的ADO.NET,到SqlHelper简单帮助类,到DAAB(Da ...

  9. 桥接模式的应用之三层架构中的业务逻辑层(BLL)与数据访问层(DAL)的解耦

    各层的作用 ①用户界面层:只负责显示和采集用户操作. ②业务逻辑层:负责UI和DAL层之间的数据交换,是系统架构中体现核心价值的部分.它关注点主要集中在业务规则的制定.业务流程的实现和业务需求的有关系 ...

最新文章

  1. 推荐一个工作流自动化工具
  2. [转]查询oracle数据库的数据库名、实例名、ORACLE_SID
  3. Python3 图片(jpg、bmp、png)转PDF
  4. Codeforces 671E Organizing a Race (贪心、线段树)
  5. SGU 160.Magic Multiplying Machine
  6. 逆水寒最新的服务器7月12日,《逆水寒》7月12日更新内容一览
  7. Mr.J--正则表达式
  8. php 实现二叉树的最大深度_LeetCode题记——104二叉树的最大深度
  9. 5个让前端代码变得简洁的最佳实践
  10. Tcl Tutorial 笔记1 · 输出
  11. 安卓微信本地数据库解密与删除聊天记录恢复 EnMicroMsg.db FTS5IndexMicroMsg_encrypt.db
  12. android标题栏尺寸,Android平台设计规范19条(轻松入门)
  13. python期货基本面分析_Python股票期货交易利器,砖型图详细绘制教程!
  14. MYSQL命令大全自学笔记
  15. 远程办公实践丨需重视以人为本的员工激励设计
  16. Linux 离线安装 autoformat
  17. python 10行代码生成词云图片(基础词云、形状词云)
  18. 个人支付宝/微信/云闪付/商户聚合码/银行卡等到账通知常用技术方案总结
  19. 移动端自适应解决方法小结
  20. 夺命雷公狗---DEDECMS----21dedecms按照地区取出电影内容

热门文章

  1. Android备份到电脑,用 TWRP「一键 Ghost」你的 Android 手机,还能备份到电脑
  2. 数学计算机教学课题,《运用信息技术,优化数学课堂教学》课题方案.doc
  3. springboot+vue图片上传显示
  4. superset 1.3 地图 汉字 展示,省市编码 ISO3166
  5. VS Code保存文件时自动删除行尾空格
  6. 最新最全python镜像源-(转)
  7. PT与PX,em(%)区别
  8. 小丸子学Hadoop系列之——hbase备份与恢复
  9. 苹果手机计算机隐藏照片app,‎App Store 上的“加密计算器 - 隐藏私人相册视频”...
  10. 不知道怎么把PDF文档转Word?来看看这几个好用的PDF转Word软件