首頁>技術>

2.4.2 EF Core -- 介紹ORMRepository 倉儲UnitOfWork 工作單元DB Context 與 DB SetEF 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/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/LighterApi

12
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • opencv打包生成exe