EF Core 正向與反向工程筆記

微軟 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)

EF Core 筆記 5 - 淺談正式環境資料庫建立與換版-黑暗執行緒 (darkthread.net)

https://www.learnentityframeworkcore.com/