天天看點

.NET 雲原生架構師訓練營(子產品二 基礎鞏固 EF Core 介紹)--學習筆記2.4.2 EF Core -- 介紹

2.4.2 EF Core -- 介紹

  • ORM
  • Repository 倉儲
  • UnitOfWork 工作單元
  • DB Context 與 DB Set
  • EF Core快速開始示例

ORM:object-rational mapping

  • 對 SQL 語言進行封裝,降低使用難度,多種 SQL 語言的抽象
  • 多出來的對事務、連接配接池、遷移、種子資料等一些功能
  • 多數情況下 ORM 生成的 SQL 腳本比你自己寫的要好

在領域層和資料映射層之間,像一個記憶體級别的領域對象集合

  • 為領域業務的單元測試提供替換點
  • 集中資料庫通路邏輯
.NET 雲原生架構師訓練營(子產品二 基礎鞏固 EF Core 介紹)--學習筆記2.4.2 EF Core -- 介紹

一個工作單元在一個事務範圍内保留所有對資料庫的變更,在這個工作單元結束的時候一次性送出所有改動到資料庫

DB Context(UnitOfWork 工作單元)

DB Set(Repository 倉儲)

EF Core 提供一個 DB Context 和多個 DB Set 組合完成資料查詢和更新操作的 ORM 架構

  • 建立一個空的 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
    {
    }
}           

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);
        }
    }
}           

需要将 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();
});           

初始化資料庫 ,注意在初始化以前確定正确配置了連接配接字元串,并且在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 中添加環境變量

.NET 雲原生架構師訓練營(子產品二 基礎鞏固 EF Core 介紹)--學習筆記2.4.2 EF Core -- 介紹

啟動項目,通路新增,清單接口

.NET 雲原生架構師訓練營(子產品二 基礎鞏固 EF Core 介紹)--學習筆記2.4.2 EF Core -- 介紹
.NET 雲原生架構師訓練營(子產品二 基礎鞏固 EF Core 介紹)--學習筆記2.4.2 EF Core -- 介紹

GitHub源碼連結:

https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/LighterApi