.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 DbSet<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/MingsonZheng/ArchitectTrainingCamp/tree/main/LighterApi
课程链接
https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记的更多相关文章
- .NET 云原生架构师训练营(权限系统 RGCA 开发任务)--学习笔记
目录 目标 模块拆分 OPM 开发任务 目标 基于上一讲的模块划分做一个任务拆解,根据任务拆解实现功能 模块拆分 模块划分已经完成了边界的划分,边界内外职责清晰 OPM 根据模块拆分画出 OPM(Ob ...
- .NET 云原生架构师训练营(权限系统 代码实现 ActionAccess)--学习笔记
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...
- .NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.WebA ...
- .NET 云原生架构师训练营(权限系统 系统演示 ActionAccess)--学习笔记
目录 模块拆分 环境配置 默认用户 ActionAccess 模块拆分 环境配置 mysql migration mysql docker pull mysql docker run -p 3306: ...
- .NET 云原生架构师训练营(权限系统 系统演示 EntityAccess)--学习笔记
目录 模块拆分 EntityAccess 模块拆分 EntityAccess 实体权限 属性权限 实体权限 创建 student https://localhost:7018/Student/dotn ...
- .NET 云原生架构师训练营(权限系统 代码实现 EntityAccess)--学习笔记
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...
- .NET 云原生架构师训练营(权限系统 代码实现 Identity)--学习笔记
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...
- .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...
- .NET 云原生架构师训练营(建立系统观)--学习笔记
目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...
- .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记
目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...
随机推荐
- mouseenter和mouseover区别
mouseenter事件 当鼠标移动到元素上时,就会触发mouseenter事件. 类似mouseover,它们两者之间的差别是:mouseover鼠标经过自身盒子会触发,经过子盒子还会触发.mous ...
- NewStarCTF 2023 公开赛道 WEEK4|CRYPTO WP
RSA Variation II 1.题目信息 提示:"Schmidt Samoa" 附件信息 from secret import flag from Crypto.Util.n ...
- PHPCMS V9安装出现DNS解析失败的解决方法-不支持采集和保存远程图片
目前因为phpcms官网停止解析后,很多人安装phpcms v9出现如下错误: 这是因为检测dns解析的域名是phpcms官网的域名,官网域名停止解析后肯定检测失败.解决方法如下: 打开/ ...
- 【OpenVINO】基于 OpenVINO Python API 部署 RT-DETR 模型
目录 1. RT-DETR 2. OpenVINO 3. 环境配置 3.1 模型下载环境 3.2 模型部署环境 4. 模型下载与转换 4.1 PaddlePaddle模型下载 4.2 IR模型转换 5 ...
- Chrony 的学习与使用
Chrony 的学习与使用 背景 之前捯饬 ntp 发现很麻烦, 经常容易弄错了. 昨天处理文件精确时间时 想到了时间同步. 发现只有自己总结的ntpdate 但是还没有 chronyd相关的总结 本 ...
- [转帖]TiFlash 面向编译器的自动向量化加速
作者:朱一帆 目录 SIMD 介绍 SIMD 函数派发方案 面向编译器的优化 SIMD 介绍 SIMD 是重要的重要的程序加速手段.CMU DB 组在 Advanced Database Syst ...
- [转帖]【InfluxDB V2.0】介绍与使用,flux查询、数据可视化
目录 一.关键概念 二.系统结构 三.配置文件 四.Flux查询语句 五.可视化数据 附录 一.关键概念 相比V1 移除了database 和 RP,增加了bucket. V2具有以下几个概念: ti ...
- [转帖]人大金仓和PG的关系
作者:山抹微云链接:https://www.zhihu.com/question/582960448/answer/2997151260来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- [转帖]Sysbench - 一种系统性能benchmark
SysBench是一款开源的.跨平台的.模块化的.多线程的性能测试工具,通过高负载地运行在数据库上,可以执行CPU/内存/线程/IO/数据库等方面的性能测试.用于评估操作系统的性能参数. 1 sysb ...
- [转帖]Kdump配置及使用(详细)总结(二)
一.简介 本文主要介绍如何打开Kdump并对其相关文件进行配置.前面章节已经对Kdump调试机理进行总结总结,具体可以点击下面链接: Kdump调试机理总结(一) crash工具分析vmcore文件常 ...