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 介绍)--学习笔记的更多相关文章

  1. .NET 云原生架构师训练营(权限系统 RGCA 开发任务)--学习笔记

    目录 目标 模块拆分 OPM 开发任务 目标 基于上一讲的模块划分做一个任务拆解,根据任务拆解实现功能 模块拆分 模块划分已经完成了边界的划分,边界内外职责清晰 OPM 根据模块拆分画出 OPM(Ob ...

  2. .NET 云原生架构师训练营(权限系统 代码实现 ActionAccess)--学习笔记

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...

  3. .NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.WebA ...

  4. .NET 云原生架构师训练营(权限系统 系统演示 ActionAccess)--学习笔记

    目录 模块拆分 环境配置 默认用户 ActionAccess 模块拆分 环境配置 mysql migration mysql docker pull mysql docker run -p 3306: ...

  5. .NET 云原生架构师训练营(权限系统 系统演示 EntityAccess)--学习笔记

    目录 模块拆分 EntityAccess 模块拆分 EntityAccess 实体权限 属性权限 实体权限 创建 student https://localhost:7018/Student/dotn ...

  6. .NET 云原生架构师训练营(权限系统 代码实现 EntityAccess)--学习笔记

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...

  7. .NET 云原生架构师训练营(权限系统 代码实现 Identity)--学习笔记

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...

  8. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  9. .NET 云原生架构师训练营(建立系统观)--学习笔记

    目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...

  10. .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记

    目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...

随机推荐

  1. Go语言安装(Windows10)

    一. 官网下载 https://golang.google.cn/dl/   二. 软件包安装 选择对应的路径进行安装   三. 环境变量设置 1.path 检查系统环境变量Path内已经添加Go的安 ...

  2. java基础-流程控制-day04

    目录 1. if单分支 2. if else 多分支 3. if else双分支 4. 随机生成一定区间的整数 5 switch语句 6. while循环 7. for循环 8. break cont ...

  3. 给Hexo博客文章加密

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 原文地址 这是个啥 首先, 这是 Hexo 生态圈中 最好的 ...

  4. [转帖]在Mysql中,什么是回表,什么是覆盖索引,索引下推?

    https://zhuanlan.zhihu.com/p/401198674 一.什么是回表查询? 通俗的讲就是,如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的 ...

  5. [转帖] 请求量突增一下,系统有效QPS为何下降很多?

    https://www.cnblogs.com/codelogs/p/17056485.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 最近我观察到一 ...

  6. [转帖]kafka压测多维度分析实战

    设置虚拟机不同的带宽来进行模拟压测 ---------kafka数据压测-------------------1.公司生产kafka集群硬盘:单台500G.共3台.日志保留7天.         1. ...

  7. [转帖]nginx 反向代理中proxy_set_header的含义

    https://www.jianshu.com/p/cd813d68ed25 0.1212020.10.23 09:29:53字数 284阅读 9,939 1.proxy_set_header设置的请 ...

  8. 【转帖】再谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP

    https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/network/2015_0708_65.html 长文是对TCP IP的 ...

  9. 【转帖】linux 软连接的使用

    https://www.cnblogs.com/sueyyyy/p/10985443.html 软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接. 具体用法是: ...

  10. 【转帖】sqlserver 在高并发的select,update,insert的时候出现死锁的解决办法

    最近在使用过程中使用SqlServer的时候发现在高并发情况下,频繁更新和频繁查询引发死锁.通常我们知道如果两个事务同时对一个表进行插入或修改数据,会发生在请求对表的X锁时,已经被对方持有了.由于得不 ...