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 SetDB 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 { }}
建立 DbContextLighterDbContext
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
最新評論