EF Core 是 Entity Framework Core 的簡稱,是 Entity Framework 的 .NET Core 版。
在 EF Core 中建立 Model 有 2 種方法,此篇文章先講解第 1 種。
- Database First:先手動建立 Database,再用 Database 生成 Model
- Code First:先手動 create Data Model,再用 Model 建立 Database
Create Database
要使用 Database First 做法,必須先手動去 Create 好 DB、Table 等項目。
執行指令用工具
在專案存取 DB 內的 Table 生成 Model 和 DbContext 的過程,稱為 Reverse Engineering (反向工程),此操作在 .NET Core 時期變得可以使用指令來處理,有 2 種工具可以選擇:
- PMC 工具:PMC 是 Package Magament Console 的簡稱,也就是 Visual Studio 內的套件管理器主控台,如果你使用 Visual Studio 開發可以直接用這個。
- CLI 工具:.NET Core CLI 工具可以跨平臺使用,可以在 cmd 執行就好,不過需要先安裝 .NET CLI
後面我 2 種工具的指令都會講,擇一使用即可
反向工程用套件
要進行 Reverse Engineering 前需要根據不同指令工具安裝不同套件。
PMC
Microsoft.EntityFrameworkCore.Tool
CLI
Microsoft.EntityFrameworkCore.Design
如果想要 2 種指令都通用,就安裝
Tool
套件,使用 CLI 指令時,Tool
內部也會幫忙調用Design
也需要安裝存取 DB 用的驅動套件,這裡我使用 SQL Server
Microsoft.EntityFrameworkCore.SqlServer
如你使用的是不同 DB 可參考微軟官方幫你整理好的套件清單 [microsoft] 資料庫提供者
Reverse Engineering (反向工程)
下指令做存取 DB 的動作,指定 DB 連線字串 & DB 驅動用套件
PMC
Scaffold-DbContext 'Data Source=.\SQLEXPRESS;Initial Catalog=MyDB;User ID=adminId;Password=adminPassword' Microsoft.EntityFrameworkCore.SqlServer
CLI
dotnet ef dbcontext scaffold "Data Source=.\SQLEXPRESS;Initial Catalog=MyDB;User ID=adminId;Password=adminPassword" Microsoft.EntityFrameworkCore.SqlServer
如果是使用上述的基本指令,他會預設幫你於執行的專案內根目錄同一層生成 DBContext 與該 DB 全部的 Model
指定 Table
如果還要指定特定 Table 可以於指令背後添加 --table TableName
(可指定多個)
dotnet ef dbcontext scaffold "Data Source=.\SQLEXPRESS;Initial Catalog=MyDB;User ID=adminId;Password=adminPassword" Microsoft.EntityFrameworkCore.SqlServer --table Items
指定匯出目錄
要指定 DbContext & Model 一同產出的路徑,可以於指令背後添加 --output-dir folderName
dotnet ef dbcontext scaffold "Data Source=.\SQLEXPRESS;Initial Catalog=MyDB;User ID=adminId;Password=adminPassword" Microsoft.EntityFrameworkCore.SqlServer --output-dir DbModels
指定分別的匯出目錄
如果要將 DbContext 與 Model 分開產出路徑,可以加 --context-dir folderName
,一旦分開產出路徑,他與 --output-dir
的用途會變成:
--context-dir
:DbContext 放置的 folder--output-dir
:DB Model 放置的 folder
dotnet ef dbcontext scaffold "Data Source=.\SQLEXPRESS;Initial Catalog=MyDB;User ID=adminId;Password=adminPassword" Microsoft.EntityFrameworkCore.SqlServer --context-dir Context --output-dir DbModels
更新 Model
如果已經不是第一次產生,當 DB 有變更時,可以再添加 --force
讓他重新產生 Context、Model 覆蓋掉原有的
dotnet ef dbcontext scaffold "Data Source=.\SQLEXPRESS;Initial Catalog=MyDB;User ID=adminId;Password=adminPassword" Microsoft.EntityFrameworkCore.SqlServer --force
停止添加 ConnectionString
指令執行的過程會出現一個 To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syn
tax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=
723263. 的提醒內容
這是因為當使用指令自動產生 DbContext 的時候,他會先預設將 connection string 直接 hard-code 在 DbContext 內,他會貼心地告訴你這樣是不好的,之後要記得移到 appsetting.json 並使用 configuration 存取他。
不過如果改用 DI 注入就可以不用再於 DbContext 內設置了
就可以添加--no-onconfiguring
,產生的 DbContext 內就沒有 OnConfiguring() 了
dotnet ef dbcontext scaffold "Data Source=.\SQLEXPRESS;Initial Catalog=MyDB;User ID=adminId;Password=adminPassword" Microsoft.EntityFrameworkCore.SqlServer --force --no-onconfiguring
還有更多其他指令可以參考微軟官方的 [microsoft] 反向工程
End