回顾

上次我们讲到了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. 动态修改页面Meta 标签 keywords description
  2. matlab实现二项分布
  3. matlab一致性检验程序,一致性检验的源程序.doc
  4. 非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了!
  5. ListDictionary:改进的OrderedDictionary
  6. Sound Studio for Mac - 音频编辑处理工具
  7. ASP .NET中一个可以用来大作文章的地方。
  8. matlab怎么实现循环码,利用Matlab实现循环码编码
  9. css3 呼吸的莲花_心肾呼吸法—莲花能量冥想*
  10. OpenWRT安装Home Assistant
  11. 版权符号©的输入方法
  12. 回溯算法 --- 例题6.最大团问题
  13. ONF代理执行董事Rick Bauer出走MEF
  14. nginx中配置不输入端口(指定地址)访问项目的方法
  15. EditText输入完成后自动关闭输入法
  16. 服务器(CentOS7)配置安装oracle12c(v12.2.0)
  17. 定义一个矩形类Rectangle:(知识点:对象的创建和使用)
  18. 普利姆(prim)算法与迪杰斯特拉(dijestella)算法
  19. 一款支持大恒相机、IDS相机、普通USB相机和机械手的标定工具
  20. 什么叫首充?关于流量卡首充的说明!

热门文章

  1. 可用于电子书阅读器的开源阅读器软件项目
  2. 【MATLAB】plot和fplot的区别
  3. 计算机电源可以改装,玩转电源:将电脑电源改成可调稳压电源的设计
  4. SUSE12安装SAP HANA 2.0内存数据库
  5. ios表格添加底纹_如何在Word中的表格单元格中添加底纹
  6. VC++的窗口句柄和窗口ID
  7. 杜教筛 (包括线筛) 莫比乌斯函数前缀和 欧拉函数前缀和 因数和函数前缀和 因子个数前缀和 ( 分析 )...
  8. 前端基础 CSS 第十一章 使用CSS样式表 ----暑假学习第七、八天
  9. 【开发教程1】疯壳·ARM功能手机-开发板上电教程
  10. 直流电机工作原理释义