基礎知識
| 項目 | 説明 |
|---|---|
| EF Core | .NET 的 ORM 框架,支持 Code First、Database First。 |
| dotnet ef | 一個 CLI 工具,用於管理 EF Core 遷移、數據庫操作。 |
| 安裝方式 | 通常安裝在項目中(推薦):
dotnet add package Microsoft.EntityFrameworkCore.Design
全局工具: dotnet tool install --global dotnet-ef |
| 使用位置 | 在包含 *.csproj 的目錄執行,或者使用 --project 指定項目路徑。 |
在執行任何 dotnet ef 命令前,需要在 csproj 中包含 Microsoft.EntityFrameworkCore.Design 包。
命令總覽
| 命令 | 作用 | 典型場景 |
|---|---|---|
dotnet ef migrations add |
添加新的數據庫遷移 | 增加或修改實體模型後 |
dotnet ef migrations list |
查看已有遷移 | 確認數據庫版本 |
dotnet ef migrations remove |
刪除最新遷移 | 回滾剛添加但未應用的遷移 |
dotnet ef migrations script |
生成 SQL 腳本 | 手工執行遷移 |
dotnet ef database update |
更新數據庫到指定遷移 | 同步數據庫與模型 |
dotnet ef database drop |
刪除數據庫 | 重置開發環境 |
dotnet ef dbcontext info |
查看 DbContext 信息 | 調試上下文配置 |
dotnet ef dbcontext list |
列出可用 DbContext | 多上下文項目 |
dotnet ef dbcontext scaffold |
根據現有數據庫生成實體 | Database First 逆向工程 |
dotnet ef dbcontext optimize |
預生成模型快照以提升啓動速度 | 高性能場景 |
常用命令詳解 + 示例
創建遷移
dotnet ef migrations add InitialCreate
在 Migrations/ 目錄下生成:
YYYYMMDDHHMMSS_InitialCreate.cs:遷移代碼AppDbContextModelSnapshot.cs:模型快照文件
常用參數:
| 參數 | 説明 | 示例 |
|---|---|---|
--project |
指定啓動項目 | --project ./MyApp |
--startup-project |
指定包含 Program.cs 的啓動項目 |
--startup-project ./MyApp.Web |
--context |
指定 DbContext | --context AppDbContext |
--output-dir |
指定遷移文件夾 | --output-dir Data/Migrations |
在多項目架構中(如分離DAL/啓動項目),務必同時指定--project和--startup-project。
應用遷移
dotnet ef database update
- 將數據庫更新到最新遷移。
- 如果數據庫不存在,會自動創建。
可指定版本:
dotnet ef database update InitialCreate
將數據庫回滾到指定遷移(或升級到某個中間版本)。
查看遷移
dotnet ef migrations list
輸出:
20250922121212_InitialCreate
20250923104530_AddUserTable
刪除遷移
dotnet ef migrations remove
- 刪除最新遷移文件。
- 僅限未執行
database update的遷移。
生成 SQL 腳本
dotnet ef migrations script
- 生成從初始數據庫到最新遷移的
SQL腳本。 - 可指定起止遷移:
dotnet ef migrations script InitialCreate AddUserTable -o update.sql
刪除數據庫
dotnet ef database drop
- 交互式確認後刪除數據庫。
- 可加
--force跳過確認。
查看 DbContext 信息
dotnet ef dbcontext info
輸出數據庫提供程序、連接字符串等信息。
列出 DbContext
dotnet ef dbcontext list
用於多上下文項目,可快速確認可用的 DbContext。
數據庫逆向生成實體 (Database First)
dotnet ef dbcontext scaffold \
"Server=localhost;Database=MyDb;User Id=sa;Password=Passw0rd;" \
Microsoft.EntityFrameworkCore.SqlServer \
--output-dir Models --context MyDbContext
常用參數:
| 參數 | 説明 |
|---|---|
--schema |
指定數據庫模式 |
--table |
指定表(可多次指定) |
--context-dir |
指定 DbContext 文件夾 |
--force |
覆蓋已有文件 |
--use-database-names |
保留數據庫原始命名(不做 PascalCase 轉換) |
模型預編譯優化
EF Core 6+ 提供:
dotnet ef dbcontext optimize
- 在編譯時預生成模型元數據,提升啓動速度。
- 適合大型數據庫或高性能場景。
開發常用流程示例
Code First 開發流程
# 1. 添加初始遷移
dotnet ef migrations add InitialCreate
# 2. 創建/更新數據庫
dotnet ef database update
# 3. 修改實體模型後生成新遷移
dotnet ef migrations add AddUserTable
# 4. 應用到數據庫
dotnet ef database update
Database First 開發流程
# 從現有數據庫生成實體與上下文
dotnet ef dbcontext scaffold \
"Server=localhost;Database=MyDb;User Id=sa;Password=Passw0rd;" \
Microsoft.EntityFrameworkCore.SqlServer \
--output-dir Models
常見問題與技巧
| 問題 | 解決方案 |
|---|---|
找不到 dotnet ef 命令 |
dotnet tool install --global dotnet-ef |
| 提示找不到 DbContext | 檢查 --startup-project 或 --context 是否指定正確 |
| 跨項目調用失敗 | 使用 --project 指定包含遷移的類庫項目,--startup-project 指定啓動項目 |
| 數據庫連接不生效 | 檢查 Program.cs 中 UseSqlServer/UseNpgsql 配置 |
| 生產環境手動部署 | 使用 dotnet ef migrations script 生成 SQL 並在 DBA 審核後執行 |
總結
| 命令 | 場景 |
|---|---|
dotnet ef migrations add |
創建遷移 |
dotnet ef database update |
同步數據庫 |
dotnet ef migrations list |
查看遷移歷史 |
dotnet ef dbcontext scaffold |
逆向工程 |
dotnet ef migrations script |
生成 SQL 腳本 |