.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记
2.4.2 EF Core -- 介绍
- ORM
- Repository 仓储
- UnitOfWork 工作单元
- DB Context 与 DB Set
- EF Core快速开始示例
ORM
ORM:object-rational mapping
- 对 SQL 语言进行封装,降低使用难度,多种 SQL 语言的抽象
- 多出来的对事务、连接池、迁移、种子数据等一些功能
- 多数情况下 ORM 生成的 SQL 脚本比你自己写的要好
Repository 仓储
在领域层和数据映射层之间,像一个内存级别的领域对象集合
- 为领域业务的单元测试提供替换点
- 集中数据库访问逻辑
UnitOfWork 工作单元
一个工作单元在一个事务范围内保留所有对数据库的变更,在这个工作单元结束的时候一次性提交所有改动到数据库
DB Context 与 DB Set
DB Context(UnitOfWork 工作单元)
DB Set(Repository 仓储)
EF Core 提供一个 DB Context 和多个 DB Set 组合完成数据查询和更新操作的 ORM 框架
EF Core快速开始示例
- 创建一个空的 web api 项目
- 添加 Pomelo.EntityFrameworkCore.Mysql 的 nuget 包引用
- 创建实体
- 创建 DbContext
- 配置连接字符串并且注入 DbContext
- 使用 DbContext 完成数据查询与插入
创建实体
Entity
namespace LighterApi.Data { public class Entity { /// <summary> /// 主键Id /// </summary> public string Id { get; set; } /// <summary> /// 全局唯一的身份 /// </summary> public string IdentityId { get; set; } /// <summary> /// 租户Id /// </summary> public string TenantId { get; set; } /// <summary> /// 用户Id /// </summary> public string UserId { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime CreatedAt { get; set; } /// <summary> /// 创建的用户 /// </summary> public string CreatedBy { get; set; } /// <summary> /// 最后修改时间 /// </summary> public DateTime LastUpdateAt { get; set; } /// <summary> /// 最后修改人 /// </summary> public string LastUpdateBy { get; set; } } }
Assistant
namespace LighterApi.Data.Project { public class Assistant : Entity { public string MemberId { get; set; } public string ProjectGroupId { get; set; } } }
Project
namespace LighterApi.Data.Project { public class Project : Entity { public string Title { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public string SupervisorId { get; set; } public string PlanId { get; set; } } }
Member
namespace LighterApi.Data.Project { public class Member : Entity { public int Progress { get; set; } public string ProjectId { get; set; } } }
ProjectGroup
namespace LighterApi.Data.Project { public class ProjectGroup : Entity { public string Name { get; set; } public string ProjectId { get; set; } } }
Task
namespace LighterApi.Data.Project { public class Task : Entity { public string Title { get; set; } public string SectionId { get; set; } public string Description { get; set; } public string ProjectId { get; set; } public string MemberId { get; set; } //public EnumTaskStauts Status { get; set; } } }
EnumTaskStauts
namespace LighterApi.Share { public class EnumTaskStauts { } }
创建 DbContext
LighterDbContext
namespace LighterApi.Data { public class LighterDbContext : DbContext { public LighterDbContext(DbContextOptions<LighterDbContext> options) : base(options) { } public DbSet<Project.Project> Projects { get; set; } public DbSet<Project.Member> Members { get; set; } public DbSet<Project.Assistant> Assistants { get; set; } public DbSe 21fa t<Project.ProjectGroup> ProjectGroups { get; set; } public DbSet<Project.Task> Tasks { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } } }
配置连接字符串并且注入 DbContext
需要将 server 地址修改为数据库服务器地址
appsettings.json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "ConnectionStrings": { "LighterDbContext": "server=127.0.0.1;port=7306;user=root;password=root123456@;database=lighter" }, "AllowedHosts": "*" }
Startup
public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; }
services.AddDbContext<LighterDbContext>(options => { options.UseMySql(Configuration.GetConnectionString("LighterDbContext")); }); services.AddControllers();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
使用 DbContext 完成数据查询与插入
初始化数据库 ,注意在初始化以前确保正确配置了连接字符串,并且在startup.cs中添加了DbContext的注入
// 安装dotnet tool ef工具 dotnet tool install --global dotnet-ef // 以下命令需要在api项目的目录下执行 // 在项目内安装 dotnet add package Microsoft.EntityFrameworkCore.Design //添加迁移文件 dotnet ef migrations add Init // 更新数据库 dotnet ef database update
创建控制器 ProjectController
namespace LighterApi.Controller { [ApiController] [Route("api/[controller]")] public class ProjectController : ControllerBase { private readonly LighterDbContext _lighterDbContext; public ProjectController(LighterDbContext lighterDbContext) { _lighterDbContext = lighterDbContext; } } }
列表
[HttpGet] public async Task<IEnumerable<Project>> GetListAsync(CancellationToken cancellationToken) { return await _lighterDbContext.Projects.ToListAsync(cancellationToken); }
新增
public async Task<ActionResult<Project>> CreateAsync([FromBody] Project project, CancellationToken cancellationToken) { project.Id = Guid.NewGuid().ToString(); _lighterDbContext.Projects.Add(project); await _lighterDbContext.SaveChangesAsync(cancellationToken); return StatusCode((int) HttpStatusCode.Created, project); }
修改启动端口,launchSettings.json
"applicationUrl": "https://localhost:6001;http://localhost:6000",
为了简化日期格式入参,添加 nuget 包 Microsoft.AspNetCore.Mvc.NewtonsoftJson
services.AddControllers() .AddNewtonsoftJson();
在 Postman 中添加环境变量
启动项目,访问新增,列表接口
GitHub源码链接:
https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/LighterApi
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
- .NET 云原生架构师训练营(模块二 基础巩固 EF Core 关系)--学习笔记
- .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ HelloWorld)--学习笔记
- .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 聚合)--学习笔记
- .NET 云原生架构师训练营(模块二 基础巩固 MongoDB API重构)--学习笔记
- .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 更新和删除)--学习笔记
- .NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
- Java学习笔记(一) Java基础以及数据类型介绍
- coursera NLP学习笔记之week1课程介绍&基础的文本处理
- node js 学习笔记(一) 常用模块介绍
- iOS学习笔记14(1)—Core Data简单介绍和实现
- .Net学习笔记----2015-07-08(基础复习和练习01)
- 网上图书商城项目学习笔记-031图书管理模块介绍及添加图书
- OpenCV基础入门 基于官方文档解读(5)--core模块学习
- Java基础学习笔记_java介绍以及环境变量配置
- JavaScript学习笔记(一)——JS基础知识介绍
- .Net学习笔记----2015-07-13(表格相关属性介绍及HTML小练习)
- [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第八章 Foudation Kit 介绍
- 原生js学习笔记——Ajax基础
- React Native 学习笔记十四(原生模块之数据回调)
- OpenCV(学习笔记8)-OpenCV模块介绍