项目基于前两篇文章.

本章创建一个简单版的商品管理后台api,用到EF Core用code fist迁移数据创建数据库.

创建Goods实体

在领域层xxx.Core项目[新建文件夹Goods;文件夹名称和类名称一样后面引用的时候需要Goods.Goods,所以建议文件夹名称最好是不要与类同名]在文件夹下创建Goods.cs实体类

  1. [Table("goods")]
  2. public class Goods : AuditedAggregateRoot<Guid>
  3. {
  4. /// <summary>
  5. /// 商品名称
  6. /// </summary>
  7. [Required]//必填
  8. [StringLength()]//限制长度100
  9. public string GoodsName { get; set; }
  10. /// <summary>
  11. /// 价格
  12. /// </summary>
  13. public decimal Price { get; set; }
  14. /// <summary>
  15. /// 描述
  16. /// </summary>
  17. public string Describe{ get; set; }
  18. /// <summary>
  19. /// 剩余数量
  20. /// </summary>
  21. public int SurplusQty { get; set; }
  22. /// <summary>
  23. /// 构造函数
  24. /// </summary>
  25. /// <param name="goodsName"></param>
  26. /// <param name="price"></param>
  27. /// <param name="describe"></param>
  28. /// <param name="surplusQty"></param>
  29. public Goods(string goodsName, decimal price, string describe,int surplusQty)
  30. {
  31. GoodsName = goodsName;
  32. Price = price;
  33. Describe = describe;
  34. SurplusQty = surplusQty;
  35. }
  36. }

ABP有两个基本的实体基类: AggregateRoot(领域驱动设计(DDD)的概念之一) 和 Entity,继承AggregateRoot会默认添加审计属性CreationTime,CreatorId

<Guid>Goods实体的主键类型可以是int,string等根据自己场景设置

将Goods实体添加到DbContext中

在基础层xxx.EntityFrameworkCore下找到xxxDbContext.cs加入Goods实体对应的DbSet

  1. //由于文件夹名称和类文件同名所以需要Goods.Goods不然只需要类名Goods就行了
  2. public DbSet<Goods.Goods> Goods { get; set; }

 添加新的Migration并更新数据库

1,打开程序包管理器控制台,默认项目选择Entityframework对应的项目后。执行Add-Migration Add_Goods_Entity,创建迁移

2,在程序包管理器控制台,输入Update-Database,回车执行迁移。执行成功后,查看数据库,看是否存在表及初始数据

执行成功之后刷新数据库查看是否有成功创建表goods

3,给goods表添加几条初始化数据

3.1 在基础层xxx.EntityFrameworkCore下创建Goods初始化数据类DefaultGoodsCreator.cs

  1. public class DefaultGoodsCreator
  2. {
  3. private readonly crazyDbContext _context;
  4. private List<crazy.Goods.Goods> GoodsList= GetInitialGoods();
  5. public DefaultGoodsCreator(crazyDbContext context)
  6. {
  7. _context = context;
  8. }
  9. private static List<crazy.Goods.Goods> GetInitialGoods()
  10. {
  11. return new List<crazy.Goods.Goods>
  12. {
  13. new crazy.Goods.Goods("商品1",,"描述1",),
  14. new crazy.Goods.Goods("商品2",,"描述2",),
  15. new crazy.Goods.Goods("商品3",,"描述2",),
  16. };
  17. }
  18.  
  19. public void Create()
  20. {
  21. CreateGoods();
  22. }
  23. /// <summary>
  24. /// 循环添加初始数据
  25. /// </summary>
  26. private void CreateGoods()
  27. {
  28. foreach (var goods in GoodsList)
  29. {
  30. AddGoodsIfNotExists(goods);
  31. }
  32. }
  33. /// <summary>
  34. /// 判断添加不存在的商品数据
  35. /// </summary>
  36. /// <param name="goods"></param>
  37. private void AddGoodsIfNotExists(crazy.Goods.Goods goods)
  38. {
  39. if (_context.Goods.IgnoreQueryFilters().Any(l => l.GoodsName == goods.GoodsName))
  40. {
  41. return;
  42. }
  43.  
  44. _context.Goods.Add(goods);
  45. _context.SaveChanges();
  46. }
  47. }

3.2在基础层xxx.EntityFrameworkCore找到文件夹Seed下的SeedHelper.cs插入代码

  1. //Goods初始化数据
  2. new DefaultGoodsCreator(context).Create();

设置crazy.Web.Host为启动项运行项目,运行之后数据库就会生成goods初始化数据.

创建应用服务

1在应用服务层xxx.Application创建文件夹Goods>Dto

①添加GoodsDto.cs注意:以下截图中用的是AutoMapFrom(当前实体只能转为映射实体,当前实体必须字段跟映射实体一样)这个是错误的正确的应该是下面代码中的AutoMapTo(当前实体和映射实体可互相转换,只取必要字段不用全部匹配)

  1. [AutoMapTo(typeof(Goods))]
  2. public class GoodsDto : AuditedEntityDto<Guid>
  3. {
  4. /// <summary>
  5. /// 商品名称
  6. /// </summary>
  7. public string GoodsName { get; set; }
  8. /// <summary>
  9. /// 价格
  10. /// </summary>
  11. public decimal Price { get; set; }
  12. /// <summary>
  13. /// 描述
  14. /// </summary>
  15. public string Describe { get; set; }
  16. /// <summary>
  17. /// 剩余数量
  18. /// </summary>
  19. public int SurplusQty { get; set; }
  20. }

[AutoMapTo(typeof(Goods))]用来创建从Goods类到GoodsDto的AutoMapper映射.使用这种方法.你可以将Goods对象自动转换成GoodsDto对象

②添加CreateGoodsDto.cs用于在新增接口

  1. using Abp.Application.Services.Dto;
  2. using Abp.AutoMapper;
  3. using Abp.Runtime.Validation;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel.DataAnnotations;
  7. using System.Text;
  8.  
  9. namespace crazy.Goods.Dto
  10. {
  11. [AutoMapTo(typeof(Goods))]
  12. public class CreateGoodsDto : IShouldNormalize
  13. {
  14. /// <summary>
  15. /// 商品名称
  16. /// </summary>
  17. [Required]
  18. [StringLength()]
  19. public string GoodsName { get; set; }
  20. /// <summary>
  21. /// 价格
  22. /// </summary>
  23. public decimal Price { get; set; }
  24. /// <summary>
  25. /// 描述
  26. /// </summary>
  27. public string Describe { get; set; }
  28. /// <summary>
  29. /// 剩余数量
  30. /// </summary>
  31. public int SurplusQty { get; set; }
  32. /// <summary>
  33. /// 初始化缺省值
  34. /// </summary>
  35. public void Normalize()
  36. {
  37. SurplusQty = ;
  38. Price = 0.01M;
  39. }
  40. }
  41. }

③创建商品查询分页类PagedGoodsResultRequestDto.cs

  1. public class PagedGoodsResultRequestDto: PagedResultRequestDto
  2. {
  3. public string Keyword { get; set; }
  4. }

④在应用服务层的Goods文件夹下创建接口IGoodsAppService.cs

  1. public interface IGoodsAppService :
  2. IAsyncCrudAppService< //定义了基础的 CRUD方法:GetAsync, GetListAsync, CreateAsync, UpdateAsync 和 DeleteAsync.如果不需要扩展它,你可以继承空的IApplicationService接口定义你自己的方法
  3. GoodsDto, //展示商品
  4. Guid, //Goods实体的主键
  5. PagedGoodsResultRequestDto, //获取商品的时候用于分页和排序
  6. CreateGoodsDto, //创建
  7. GoodsDto> //更新
  8. {
  9.  
  10. }

⑤在应用服务层的Goods文件夹下创建商品服务类GoodsAppService.cs

  1. public class GoodsAppService :
  2. AsyncCrudAppService<Goods, GoodsDto, Guid, PagedGoodsResultRequestDto,
  3. CreateGoodsDto, GoodsDto>,
  4. IGoodsAppService
  5. {
  6. public GoodsAppService(IRepository<Goods, Guid> repository)//注入IRepository自动为Goods创建仓储
  7. : base(repository)
  8. {
  9.  
  10. }
  11.  
  12. /// <summary>
  13. /// 查询接口(使用Keyword查询商品名称)
  14. /// </summary>
  15. /// <param name="input"></param>
  16. /// <returns></returns>
  17. protected override IQueryable<Goods> CreateFilteredQuery(PagedGoodsResultRequestDto input)
  18. {
  19. return Repository.GetAll().WhereIf(!input.Keyword.IsNullOrWhiteSpace(), a => a.GoodsName.Contains(input.Keyword));
  20. }
  21.  
  22. }

到此就可以运行项目得到如下效果

ABP实践(3)-ASP.NET Core 2.x版本(从创建实体到输出api)简单实现商品列表及增删改的更多相关文章

  1. ABP实践(2)-ASP.NET Core 2.x版本EntityFrameworkCore(EF)使用mysql数据库

    上一篇中EntityFrameworkCore默认使用的是微软的sql server,本篇改为mysql步骤如下: 1,在基础层xxx.EntityFrameworkCore依赖项添加Pomelo.E ...

  2. ASP.NET Core EFCore 之DBFirst 自动创建实体类和数据库上下文

    通过引用Nuget包添加实体类 运行 Install-Package Microsoft.EntityFrameworkCore.SqlServer 运行 Install-Package Micros ...

  3. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  4. ASP.NET Core 2 学习笔记(十二)REST-Like API

    Restful几乎已算是API设计的标准,通过HTTP Method区分新增(Create).查询(Read).修改(Update)和删除(Delete),简称CRUD四种数据存取方式,简约又直接的风 ...

  5. ASP.NET Core on K8S学习初探(3)部署API到K8S

    在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...

  6. ASP.NET Core 1.1版本之Hello word

    1.下载ASP.NET Core 1.1版本,并且安装. 2.新建一个工作文件夹,本文以WebApiFrame名称为例建立一个新的文件夹: mk WebApiFrame 3.启动命令行,在命令行中进入 ...

  7. 【转】asp.net Core 系列【二】—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API

    在本教程中,将生成用于管理“待办事项”列表的 Web API. 不会生成 UI. 概述 以下是将创建的 API: API 描述 请求正文 响应正文 GET /api/todo 获取所有待办事项 无 待 ...

  8. 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf

    <ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...

  9. 微软官方实例 RazorPagesMovie 在 asp.net core 2.1 版本下的实战

    微软官方实例 RazorPagesMovie 在 asp.net core 2.1 版本下的实战 友情提示: 操作系统: MacOS 10.13.5 dotnet core: version 2.1. ...

随机推荐

  1. 【Django】django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.

    最近学习Django的过程中,在cmd打算使用python manage.py shell来测试数据的时候,当我一导入自己写的model类,就发现报了这个错误django.core.exception ...

  2. 项目总结18-使用textarea无法判断空值之坑

    项目总结18-使用textarea无法判断空值之坑 今天使用js判断textarea为空,发现怎么都无法成功仔细做了对比测试,发现结果如下: 1-JS代码 if($("#content&qu ...

  3. centos 7 安装python 3.x

    首先 安装一些 可能需要的依赖: yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-d ...

  4. 简单利用jQuery,让前端开发不再依赖于后端的接口

    前端开发的过程中,我们免不了和后端进行联调,这时候就会出现以下的尴尬场景: 接口没写好,没法做接下来的功能 功能写好了,接口没写好,没法测这个功能 联调了,出了BUG,不知道锅在谁身上,只得陪后端耗时 ...

  5. java中random的几个方法的使用Math.random()和random().

    random java中我们有时候也需要使用使用random来产生随机数,下面我来简单的介绍下java中random的使用方法 第一种:Math.random() public static doub ...

  6. VS“新建网站”与“新建Asp.Net Web 应用程序”的区别

    WebApplication(新建Asp.Net Web 应用程序)编程模型的优点:针对大型网站 1.编译速度网站编译速度快,使用了增量编译模式,仅仅只有文件被修改后,这部分才会被增量编译进去. 2. ...

  7. MySQL缓存参数优化(转)

    MySQL 数据库性能优化之缓存参数优化 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在 ...

  8. EventTrigger动态添加监听事件

    在 Unity3D 中,通过拖拽的方式在 EventTrigger 组件中添加监听事件就不多说了,很简单.这里主要说的是通过代码动态往 EventTrigger 组件中添加监听事件,有个很坑的地方,就 ...

  9. cp备份操作时如何忽略指定的目录

    需求场景:进行CP拷贝备份的时候,子目录里面的某些大文件或是一些log文件是无需备份的,那么在CP操作时需要忽略掉指定的目录. 案例演示如下:备份data目录,但是不包括里面的share子目录. 先看 ...

  10. 日期Data类,日历类Calendar

    用于得到当前时间,和设置日期类数据 public void testDate() { // 创建一个日期对象 Date date = new Date(); /** * 从1900年1月1日 00:0 ...