微軟 EF Core Code First & DB First 的指令整理筆記
概述
EF Core 全名為 Entity Framework Core﹐是微軟Entity Framework 資料存取技術的輕量型﹑可擴充﹑Open Source且可跨平台。
EF Core 可作為物件關聯式的對應程式(O/RM)
- 可讓.Net開發人員使用 .Net 物件來處理資料庫。
- 無須使用在一般情況下需要撰寫的大部分資料存取碼。(意思是大部分情況不用撰寫SQL指令碼)
資料來源:Entity Framework Core 概觀 - EF Core | Microsoft Learn
什麼是正向工程和反向工程?
正向工程(Code First):
先撰寫符合資料庫的模型程式﹐再使用EF Core指令移轉建立資料庫﹐移轉允許資料庫隨著模型變更發展﹐適合新系統的開發。
反向工程(DB First):
與過去開發相同﹐先設計資料庫﹐再使用EF Core移轉指令產生模型類別檔﹐這對於舊系統已有資料庫的適合。
如何使用?
不論正向或反向工程﹐都是透過指令完成。有兩種方式﹐使用PMC工具或CLI工具。
PMC工具:
Package Magament Console的簡稱﹐使用Visual Studio IDE 開發工具內的套件管理器主控台。
套件安裝
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.SqlServer → 資料庫提供者 - EF Core | Microsoft Learn
Microsoft.EntityFrameworkCore.Tools
注意安裝的版本﹐使用 core 3.1則安裝 3.1.x﹐使用 .Net 6 則安裝 6.x 版本
CLI工具:
.Net Core CLI工具﹐在CMD 或PowerShell 下執行﹐需要先安裝 .Net CLI。需要注意在 EF Core 3.0 開始EF Core 命列列工具不再包含於 .Net Core SDK中﹐需要另外安裝。
安裝指令:dotnet tool install --global dotnet-ef
參考:https://blog.darkthread.net/blog/ef-core-notes-5/
如果安裝成功﹐可以在CMD中執行 dotnet ef 看到獨角獸
指令用法
DB First
使用CLI工具﹐開啟CMD或PowerShell﹐將位置先切換到專案目錄之下
dotnet ef dbcontext scaffold “資料庫連接字串” Microsoft.EntityFrameworkCore.SqlServer --output-dir 資料夾名稱
例
dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=SchoolContext-ne6" Microsoft.EntityFrameworkCore.SqlServer --output-dir MyModles
上述指令會在專案之下產生一個MyModles 的資料夾﹐並在之下產生對應Table的模型class檔﹐及一個以資料庫名稱開頭的 SchoolContextne6Context.cs DbContext檔案。
如果要將匯出的模型和dbContext分別指定到不同的資料夾﹐則使用以下的參數
--context-dir à DbContext放置的資料夾
--output-dir à DB Model 放置的資料夾
例
dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=SchoolContext-ne6" Microsoft.EntityFrameworkCore.SqlServer --output-dir MyModles\Enities --context-dir Context
轉檔過程會有一段醒目的提醒文字
這是在還原過程中將資料庫連線相關資訊 hard code在 dbcontext 檔案當中﹐這段文字就是提醒這是不好的做法﹐應該要把相關資訊移到 appsettings.json 。
如果原本系統已經有做DI注入﹐則可以加上 --no-onconfiguring 這樣產生的dbcontext 檔案中就不會有 OnConfiguring()。
只還原某些 Table
--table TableName
一次只能一個Table﹐如果有多個Table則執行多次
更新Model
如果之前已經有執行過還原工程﹐之後資料庫結構有改變(Table 欄位或型態有變更)﹐則加上 --force 重新產生Context和Model覆蓋原本的
Code First
已經設計好資料模型及DbContext﹐要將設計的資料模型建立出資料庫﹐開啟CMD或PowerShell並切換到專案目錄下
建立Model快照與升級動作
dotnet ef migrations add InitialCreate
會產生一個Migrations資料夾﹐建立一個以日期開頭InitialCreate結尾的cs檔案。
產生Script
dotnet ef migrations script
在畫面上可以看到要建立資料表的SQL Script﹐如果要將產生的sql script 存為檔案則
dotnet ef migrations script > 檔案名稱
當Model的結構有異動時﹐資料庫要跟著異動﹐這時要產生一個新的移轉作業
dotnet ef migrations add modelUpdate1
會產生一個以日期開頭modelUpdate1結尾的cs檔案
這時下指令dotnet ef migrations list 會列出有那些移轉作業
要產生SQL Script 則
dotnet ef migrations script InitialCreate
注意﹐這裏指令中並不是modelUpdate1
注意事項
- EF Core CLI 的版本需要和專案中的套件版本一致
例如剛開始設計時﹐專案中安裝的套件EntityFrameworkCore是6.0.6 版﹐原本的EF Core CLI 也是一樣 6.0.6 版﹐後來專案中的套件升級為6.0.11版﹐則EF Core CLI 版本也必須跟著更新
dotnet tool update --global dotnet-ef
dotnet tool update --global dotnet-ef --version 6.0.11
- 專案中有多個DbContext
如果執行dotnet ef migraitons add initCreateDB 出現以下錯誤
More than one DbContext was found. Specify which one to use. Use the '-Context' parameter for PowerShell commands and the '--context' parameter for dotnet commands.
這是因為專案中用了多個DbContext﹐在使用指令生成資料庫文件時必須指定要用那一個DbContext﹐要在指令後面加上 -c DbContext類的名稱
註:文章裏面使用的範例 nethawkChen/ContosoUniversityNet6: Vue3 的學習筆記 (github.com)
參考資料
還原工程 - EF Core | Microsoft Learn
資料庫提供者 - EF Core | Microsoft Learn
[.NET Core] EF Core 建立模型 - Database First | K. C. - 點部落 (dotblogs.com.tw)