假設未來想替任務新增「截止日期」。以前,可能需要手動執行 SQL:
ALTER TABLE Tasks
ADD COLUMN DueDate TEXT;
學會 Migration 後,我們可以先修改 C# Model,再建立 Migration,讓 EF Core 幫我們管理資料表結構的變更。
使用昨天的程式碼,在終端機輸入:
dotnet tool install --global dotnet-ef --version "10.0.*"
繼續在終端機輸入:
dotnet tool install --global dotnet-ef --version "10.0.*"
using Microsoft.EntityFrameworkCore;
using TaskFlow3.Api.Data;
using TaskFlow3.Api.Services;
var builder = WebApplication.CreateBuilder(args);
// OpenAPI
builder.Services.AddOpenApi();
// Controller
builder.Services.AddControllers();
builder.Services.AddSingleton<ITaskService, TaskService>();
string dbPath = Path.Combine(
builder.Environment.ContentRootPath,
"taskflow-ef.db"
);
builder.Services.AddDbContext<TaskFlowDbContext>(options =>
options.UseSqlite($"Data Source={dbPath}")
);
var app = builder.Build();
// 開發環境才啟用 OpenAPI 和 Swagger UI
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/openapi/v1.json", "v1");
});
}
app.UseHttpsRedirection();
// 啟用 Controller 路由
app.MapControllers();
// 測試路由
app.MapGet("/test", () => "伺服器正常運作!");
app.MapGet("/db-check", async (TaskFlowDbContext db) =>
{
var tasks = await db.Tasks.ToListAsync();
return Results.Ok(tasks);
});
app.Run();
在終端機輸入:
dotnet build
輸入:
dotnet ef migrations add InitialCreate
輸入:
dotnet ef database update
開啟 DB Browser for SQLite。
INSERT INTO Tasks (Title, IsCompleted)
VALUES ('完成 Day 17 Migration', 0);
SELECT * FROM Tasks;
執行後按「寫入變更」
回到 VS Code 終端機:
dotnet run
結果