ABP实践(3)-ASP.NET Core 2.x版本(从创建实体到输出api)简单实现商品列表及增删改
项目基于前两篇文章.
本章创建一个简单版的商品管理后台api,用到EF Core用code fist迁移数据创建数据库.
创建Goods实体
在领域层xxx.Core项目[新建文件夹Goods;文件夹名称和类名称一样后面引用的时候需要Goods.Goods,所以建议文件夹名称最好是不要与类同名]在文件夹下创建Goods.cs实体类
[Table("goods")]
public class Goods : AuditedAggregateRoot<Guid>
{
/// <summary>
/// 商品名称
/// </summary>
[Required]//必填
[StringLength()]//限制长度100
public string GoodsName { get; set; }
/// <summary>
/// 价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Describe{ get; set; }
/// <summary>
/// 剩余数量
/// </summary>
public int SurplusQty { get; set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="goodsName"></param>
/// <param name="price"></param>
/// <param name="describe"></param>
/// <param name="surplusQty"></param>
public Goods(string goodsName, decimal price, string describe,int surplusQty)
{
GoodsName = goodsName;
Price = price;
Describe = describe;
SurplusQty = surplusQty;
}
}
ABP有两个基本的实体基类: AggregateRoot(领域驱动设计(DDD)的概念之一)
和 Entity,继承AggregateRoot会默认添加审计属性CreationTime,CreatorId
<Guid>
是Goods
实体的主键类型可以是int,string等根据自己场景设置
将Goods实体添加到DbContext中
在基础层xxx.EntityFrameworkCore下找到xxxDbContext.cs加入Goods实体对应的DbSet
//由于文件夹名称和类文件同名所以需要Goods.Goods不然只需要类名Goods就行了
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
public class DefaultGoodsCreator
{
private readonly crazyDbContext _context;
private List<crazy.Goods.Goods> GoodsList= GetInitialGoods();
public DefaultGoodsCreator(crazyDbContext context)
{
_context = context;
}
private static List<crazy.Goods.Goods> GetInitialGoods()
{
return new List<crazy.Goods.Goods>
{
new crazy.Goods.Goods("商品1",,"描述1",),
new crazy.Goods.Goods("商品2",,"描述2",),
new crazy.Goods.Goods("商品3",,"描述2",),
};
} public void Create()
{
CreateGoods();
}
/// <summary>
/// 循环添加初始数据
/// </summary>
private void CreateGoods()
{
foreach (var goods in GoodsList)
{
AddGoodsIfNotExists(goods);
}
}
/// <summary>
/// 判断添加不存在的商品数据
/// </summary>
/// <param name="goods"></param>
private void AddGoodsIfNotExists(crazy.Goods.Goods goods)
{
if (_context.Goods.IgnoreQueryFilters().Any(l => l.GoodsName == goods.GoodsName))
{
return;
} _context.Goods.Add(goods);
_context.SaveChanges();
}
}
3.2在基础层xxx.EntityFrameworkCore找到文件夹Seed下的SeedHelper.cs插入代码
//Goods初始化数据
new DefaultGoodsCreator(context).Create();
设置crazy.Web.Host为启动项运行项目,运行之后数据库就会生成goods初始化数据.
创建应用服务
1在应用服务层xxx.Application创建文件夹Goods>Dto
①添加GoodsDto.cs注意:以下截图中用的是AutoMapFrom(当前实体只能转为映射实体,当前实体必须字段跟映射实体一样)这个是错误的正确的应该是下面代码中的AutoMapTo(当前实体和映射实体可互相转换,只取必要字段不用全部匹配)
[AutoMapTo(typeof(Goods))]
public class GoodsDto : AuditedEntityDto<Guid>
{
/// <summary>
/// 商品名称
/// </summary>
public string GoodsName { get; set; }
/// <summary>
/// 价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Describe { get; set; }
/// <summary>
/// 剩余数量
/// </summary>
public int SurplusQty { get; set; }
}
[AutoMapTo(typeof(Goods))]
用来创建从Goods
类到GoodsDto
的AutoMapper映射.使用这种方法.你可以将Goods
对象自动转换成GoodsDto
对象
②添加CreateGoodsDto.cs用于在新增接口
using Abp.Application.Services.Dto;
using Abp.AutoMapper;
using Abp.Runtime.Validation;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text; namespace crazy.Goods.Dto
{
[AutoMapTo(typeof(Goods))]
public class CreateGoodsDto : IShouldNormalize
{
/// <summary>
/// 商品名称
/// </summary>
[Required]
[StringLength()]
public string GoodsName { get; set; }
/// <summary>
/// 价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Describe { get; set; }
/// <summary>
/// 剩余数量
/// </summary>
public int SurplusQty { get; set; }
/// <summary>
/// 初始化缺省值
/// </summary>
public void Normalize()
{
SurplusQty = ;
Price = 0.01M;
}
}
}
③创建商品查询分页类PagedGoodsResultRequestDto.cs
public class PagedGoodsResultRequestDto: PagedResultRequestDto
{
public string Keyword { get; set; }
}
④在应用服务层的Goods文件夹下创建接口IGoodsAppService.cs
public interface IGoodsAppService :
IAsyncCrudAppService< //定义了基础的 CRUD方法:GetAsync, GetListAsync, CreateAsync, UpdateAsync 和 DeleteAsync.如果不需要扩展它,你可以继承空的IApplicationService接口定义你自己的方法
GoodsDto, //展示商品
Guid, //Goods实体的主键
PagedGoodsResultRequestDto, //获取商品的时候用于分页和排序
CreateGoodsDto, //创建
GoodsDto> //更新
{ }
⑤在应用服务层的Goods文件夹下创建商品服务类GoodsAppService.cs
public class GoodsAppService :
AsyncCrudAppService<Goods, GoodsDto, Guid, PagedGoodsResultRequestDto,
CreateGoodsDto, GoodsDto>,
IGoodsAppService
{
public GoodsAppService(IRepository<Goods, Guid> repository)//注入IRepository自动为Goods创建仓储
: base(repository)
{ } /// <summary>
/// 查询接口(使用Keyword查询商品名称)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
protected override IQueryable<Goods> CreateFilteredQuery(PagedGoodsResultRequestDto input)
{
return Repository.GetAll().WhereIf(!input.Keyword.IsNullOrWhiteSpace(), a => a.GoodsName.Contains(input.Keyword));
} }
到此就可以运行项目得到如下效果
ABP实践(3)-ASP.NET Core 2.x版本(从创建实体到输出api)简单实现商品列表及增删改的更多相关文章
- ABP实践(2)-ASP.NET Core 2.x版本EntityFrameworkCore(EF)使用mysql数据库
上一篇中EntityFrameworkCore默认使用的是微软的sql server,本篇改为mysql步骤如下: 1,在基础层xxx.EntityFrameworkCore依赖项添加Pomelo.E ...
- ASP.NET Core EFCore 之DBFirst 自动创建实体类和数据库上下文
通过引用Nuget包添加实体类 运行 Install-Package Microsoft.EntityFrameworkCore.SqlServer 运行 Install-Package Micros ...
- 中小研发团队架构实践之生产环境诊断工具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如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...
- ASP.NET Core 2 学习笔记(十二)REST-Like API
Restful几乎已算是API设计的标准,通过HTTP Method区分新增(Create).查询(Read).修改(Update)和删除(Delete),简称CRUD四种数据存取方式,简约又直接的风 ...
- ASP.NET Core on K8S学习初探(3)部署API到K8S
在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...
- ASP.NET Core 1.1版本之Hello word
1.下载ASP.NET Core 1.1版本,并且安装. 2.新建一个工作文件夹,本文以WebApiFrame名称为例建立一个新的文件夹: mk WebApiFrame 3.启动命令行,在命令行中进入 ...
- 【转】asp.net Core 系列【二】—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API
在本教程中,将生成用于管理“待办事项”列表的 Web API. 不会生成 UI. 概述 以下是将创建的 API: API 描述 请求正文 响应正文 GET /api/todo 获取所有待办事项 无 待 ...
- 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
<ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...
- 微软官方实例 RazorPagesMovie 在 asp.net core 2.1 版本下的实战
微软官方实例 RazorPagesMovie 在 asp.net core 2.1 版本下的实战 友情提示: 操作系统: MacOS 10.13.5 dotnet core: version 2.1. ...
随机推荐
- 100-days: eleven
Title: Facebook's live streaming(网络直播) is criticized(批评) after mosque(清真寺) shooting(枪击). live adj.现场 ...
- java基础-- 之类型转换 和 一些运算符
--- 首先 看一个 Scanner 类 import java.util.Scanner; public class TestScanner { public static void ma ...
- [leetcode]152. Maximum Product Subarray最大乘积子数组
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
- [leetcode]52. N-Queens II N皇后
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
- 4412 uboot启动分析
感谢sea1105, https://blog.csdn.net/sea1105/article/details/52142772 在学习过程中,由于tiny4412资料太过于少,因此参考210的视屏 ...
- ie每次登陆出现:Windows安全性 iexplore.exe 正在连接到 记住我的凭证不起作用
解决方案: ie浏览器--设置--Intenet选项--安全--Internet--自定义级别--用户身份验证--登陆 勾选自动使用当前用户名和密码登陆 确定--确定
- 搭建django
虚拟环境配置 pip install virtualenv 一般需要安装一个管理工具:pip install virtualenvwrapper-win 只有它可以使用workon 创建虚拟环境:mk ...
- eclipse启动时出现无法创建java虚拟机
最 近一直在用eclipse开发android程序,今天不知怎么的启动eclipse时就会出现Failed to create java virtual machine,无法打开eclipse程序,折 ...
- 安装bazel(syntaxnet依赖工具)
1.简介 Bazel是一个类似于Make的工具,是Google为其内部软件开发的特点量身定制的工具,如今Google使用它来构建内部大多数的软件.它的功能有诸多亮点: 多语言支持:目前Bazel默 ...
- file 上传大小限制问题
今天突然传了一张很大的图片 结果怎么传都获取不到信息(如下); 最后查看了下php.ini 中的 " upload_max_filesize "最大只允许了2M! 改下就可以 ...