项目基于前两篇文章.
本章创建一个简单版的商品管理后台 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)]// 限制长度 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",100,"描述 1",10), new crazy.Goods.Goods("商品 2",260,"描述 2",50), new crazy.Goods.Goods("商品 3",99,"描述 2",1), }; } 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
1添加 GoodsDto.cs
[AutoMapFrom(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; } } View Code
[AutoMapFrom(typeof(Goods))]用来创建从 Goods 类到 GoodsDto 的 AutoMapper 映射. 使用这种方法. 你可以将 Goods 对象自动转换成 GoodsDto 对象
2添加 CreateUpdateBookDto 用于在创建或更新
[AutoMapFrom(typeof(Goods))] public class CreateUpdateGoodsDto : AuditedEntityDto<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; } = 999; }
3在应用服务层的 Goods 文件夹下创建接口 IGoodsAppService.cs
public interface IGoodsAppService : IAsyncCrudAppService<// 定义了基础的 CRUD 方法: GetAsync, GetListAsync, CreateAsync, UpdateAsync 和 DeleteAsync. 如果不需要扩展它, 你可以继承空的 IApplicationService 接口定义你自己的方法 GoodsDto, // 展示商品 Guid, //Goods 实体的主键 PagedAndSortedResultRequestDto, // 获取商品的时候用于分页和排序 CreateUpdateGoodsDto, // 创建 CreateUpdateGoodsDto> // 更新 { }
4在应用服务层的 Goods 文件夹下创建商品服务类 GoodsAppService.cs
public class GoodsAppService : AsyncCrudAppService<Goods, GoodsDto, Guid, PagedAndSortedResultRequestDto, CreateUpdateGoodsDto, CreateUpdateGoodsDto>, IGoodsAppService { public GoodsAppService(IRepository<Goods, Guid> repository)// 注入 IRepository 自动为 Goods 创建仓储 : base(repository) { } }
到此就可以运行项目得到如下效果
来源: https://www.cnblogs.com/wuyubing/p/10790963.html