.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 ...
随机推荐
- 手把手实践教你删除项目当中无用的npm包
在公司中,我们大部分都是多人共同开发和长时间维护一个项目,但是有时候我们会发现有很多已经废弃的npm 包存在 package.json 中,我们想要删除,但是又不能盲目的删除?那么 depcheck ...
- zzuli 1023
java 读入单个字符 import java.util.Scanner; public class Main{ public static void main(String args[]){ Sca ...
- KVM 核心功能:磁盘虚拟化
1 磁盘虚拟化简介 QEMU-KVM 提供磁盘虚拟化,从虚拟机角度看其自身拥有的磁盘即是实际的物理磁盘.实际上,虚拟机读写的磁盘数据保存在 host 上的物理磁盘. QEMU-KVM 主要有如下几 ...
- SpringBoot03:首页国际化
页面国际化 有的时候,我们的网站会去涉及中英文甚至多语言的切换,这时候我们就需要学习国际化! 1.配置文件编写 首先在resources资源文件下新建一个i18n目录,存放国际化配置文件 新建一个lo ...
- [转帖]ESXi主机RAID卡_HBA卡_网卡 型号_固件_驱动查询
https://www.cnblogs.com/vincenshen/p/12332142.html 一.RAID卡/HBA卡 型号_固件_驱动查询 1. 查询所有SCSI设备列表 # esxcfg- ...
- [转帖]goproxy的设置
goproxy.io 是全球最早的 Go modules 镜像代理服务之一 [大陆地区建议使用 proxy.golang.com.cn],采用 CDN 加速服务为开发者提供依赖下载, 该服务由一批热爱 ...
- [转帖]查看请求在nginx中消耗的时间
需求:查看请求在nginx中消耗的时间,不包括程序响应时间. 1.声明日志的格式,在nginx配置文件nginx.conf里的http下添加如下内容: log_format test '$remote ...
- 【转帖】TCP内核参数
https://www.cnblogs.com/chia/p/7799231.html tcp_syn_retries :INTEGER默认值是5对于一个新建连接,内核要发送多少个 SYN 连接请求才 ...
- Python学习之十三_pip的学习
Python学习之十三_pip的学习 pip的含义 pip: pip is the package installer for Python. You can use pip to install p ...
- [转帖]Linux如何查看网关地址
转至:https://baijiahao.baidu.com/s?id=1733537078943023051&wfr=spider&for=pc 服务器之间的通信是通过ip地址来 ...