[.NET Core] EF Core 建立模型 - Database First

EF Core 是 Entity Framework Core 的簡稱,是 Entity Framework 的 .NET Core 版。

在 EF Core 中建立 Model 有 2 種方法,此篇文章先講解第 1 種

  1. Database First:先手動建立 Database,再用 Database 生成 Model
  2. 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