2.4.2 EF Core -- 介紹
- ORM
- Repository 倉儲
- UnitOfWork 工作單元
- DB Context 與 DB Set
- EF Core快速開始示例
ORM:object-rational mapping
- 對 SQL 語言進行封裝,降低使用難度,多種 SQL 語言的抽象
- 多出來的對事務、連接配接池、遷移、種子資料等一些功能
- 多數情況下 ORM 生成的 SQL 腳本比你自己寫的要好
在領域層和資料映射層之間,像一個記憶體級别的領域對象集合
- 為領域業務的單元測試提供替換點
- 集中資料庫通路邏輯
一個工作單元在一個事務範圍内保留所有對資料庫的變更,在這個工作單元結束的時候一次性送出所有改動到資料庫
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 中添加環境變量
啟動項目,通路新增,清單接口