abp(net core)+easyui+efcore实现仓储管理系统——ABP整体介绍(一)html
abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二)数据库
abp(net core)+easyui+efcore实现仓储管理系统——领域层建立实体(三)架构
在上一篇文章中咱们建立了Module实体并在数据库中生成了数据表,在这一文章中咱们介绍如何来对数据库进行操做。框架
1、先来介绍下仓储异步
仓储(Repository): 仓储用来操做数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。ide
在ABP中,仓储类要实现IRepository接口,接口定义了经常使用的增删改查以及聚合方法,其中包括同步及异步方法。主要包括如下方法:函数
ABP针对不一样的ORM框架对这个接口进行了默认的实现:post
1) 对于EntityFrameworkCore,提供了EfCoreRepositoryBase<TDbContext, TEntity, TPrimaryKey>的泛型版本的实现方式。
2) 对于NHibernate,提供了NhRepositoryBase<TEntity, TPrimaryKey>的泛型版本的实现方式。ui
这些使用泛型的实现类,在大多数的时候,这些实现类中的方法已经足够应付通常增删改查的须要。若是默认实现类中的方法对于实体类来讲已够用了,咱们便不须要再去建立这个实体所需的仓储接口与实现类。直接经过在应用服务层定义仓储引用,而后经过构造函数注入便可。spa
接下来,咱们来说讲如何自定义仓储实现类。
2、如何实现自定义仓储
1. 在Visual Studio 2017的“解决方案资源管理器”中,右键单击在领域层“ABP.TPLMS.Core”项目。 选择“添加” > “新建文件夹”。
2.将文件夹命名为“IRepositories”。
3. 右键单击“IRepositories”文件夹,而后选择“添加” > “类”。 在弹出对话框“添加新项- ABP.TPLMS.Core”中选择接口,将接口命名为 IModuleRepository。而后使用鼠标左键单击“添加”按钮。以下图。
4. IModuleRepository接口的代码以下。
using Abp.Domain.Repositories; using ABP.TPLMS.Entitys; using System; using System.Collections.Generic; using System.Text; namespace ABP.TPLMS.IRepositories { interface IModuleRepository: IRepository<Module> { /// <summary> /// 分页查询功能模块 /// </summary> /// <param name="pageindex">页索引</param> /// <param name="pagesize">每页多少条</param> /// <returns>模块列表</returns> IEnumerable<Module> LoadModules(int pageindex, int pagesize); /// <summary> /// 批量删除 /// </summary> /// <param name="ids"></param> /// <returns></returns> bool Delete(string ids); } }
1. 在Visual Studio 2017的“解决方案资源管理器”中,打开“ABP.TPLMS.EntityFrameworkCore”项目,找到“Repositories”目录,在这个目录中有一个ABP生成的基类。以下图。
2. 鼠标右键单击“Repositories”文件夹,而后选择“添加” > “类”。 在弹出对话框“添加新项- ABP.TPLMS.EntityFrameworkCore”中类命名为 ModuleRepository。而后使用鼠标左键单击“添加”按钮。代码以下。
using Abp.EntityFrameworkCore; using ABP.TPLMS.Entitys; using ABP.TPLMS.IRepositories; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace ABP.TPLMS.EntityFrameworkCore.Repositories { public class ModuleRepository:TPLMSRepositoryBase<Module>, IModuleRepository { public ModuleRepository(IDbContextProvider<TPLMSDbContext> dbContextProvider) : base(dbContextProvider) { } public bool Delete(string ids) { var idList = ids.Split(','); Expression<Func<Module, bool>> exp = m => idList.Contains(m.Id.ToString()); bool result = true; Delete(exp); return result; } public IEnumerable<Module> LoadModules(int pageindex, int pagesize) { return Context.Modules.OrderBy(u => u.Id).Skip((pageindex - 1) * pagesize).Take(pagesize); } } }
该仓储实现,继承自模板生成的TPLMSRepositoryBase泛型抽象类,而后再实现IModuleRepository接口。这里要显示声明实现类的有参构造函数,使用泛型的IDbContextProvider将数据库上下文的子类ChargeStationContext传给父类的构造函数。以下图。
4、仓储的注意事项