Entity Framework Core 的命令行介面 (CLI) 工具會執行設計時間開發工作。 例如,他們會建立 移轉、套用移轉,並根據現有的資料庫為模型產生程序代碼。 這些命令是跨平臺 dotnet 命令的延伸模組,這是 .NET SDK 的一部分。 這些工具可與 .NET 專案搭配使用。
使用 Visual Studio 時,請考慮使用 封裝管理員 控制台工具,而不是 CLI 工具。 封裝管理員 主控台工具自動:
- 請與 封裝管理員 主控台中選取的目前專案搭配使用,而不需要手動切換目錄。
- 開啟命令完成之後所產生的檔案。
- 提供命令、參數、專案名稱、內容類型和移轉名稱的索引標籤完成。
安裝工具
dotnet ef 可以安裝為全域或本機工具。 大部分開發人員偏好使用下列命令安裝 dotnet ef 為全域工具:
dotnet tool install --global dotnet-ef
若要使用它做為本機工具,請使用工具指令清單檔還原專案宣告為工具相依性的相依性。
使用下列命令更新工具:
dotnet tool update --global dotnet-ef
您必須先將套件新增 Microsoft.EntityFrameworkCore.Design 至特定專案,才能使用特定專案上的工具。
dotnet add package Microsoft.EntityFrameworkCore.Design
Verify installation
執行下列命令以確認 EF Core CLI 工具是否已正確安裝:
dotnet ef
命令輸出會辨識使用中工具的版本:
_/\__
---==/ \\
___ ___ |. \|\
| __|| __| | ) \\\
| _| | _| \_/ | //|\\
|___||_| / \\\/\\
Entity Framework Core .NET Command-line Tools 2.1.3-rtm-32065
<Usage documentation follows, not shown.>
更新工具
使用 dotnet tool update --global dotnet-ef 將全域工具更新為最新的可用版本。 如果您已在項目中本機安裝工具, 請使用 dotnet tool update dotnet-ef。 將附加 --version <VERSION> 至命令以安裝特定版本。
如需詳細資訊,請參閱 dotnet 工具檔的更新一節。
使用工具
使用工具之前,您可能必須建立啟始專案或設定環境。
目標專案和啟始專案
命令會參考 專案 和 啟始專案。
專案也稱為目標項目,因為它是命令新增或移除檔案的位置。 根據預設,目前目錄中的專案是目標專案。 您可以使用 選項,將不同的專案指定為目標專案
。--project啟動 專案 是工具建置和執行的專案。 工具必須於設計時間執行應用程式程序代碼,才能取得專案的相關信息,例如資料庫 連接字串和模型的組態。 根據預設,目前目錄中的專案是啟動專案。 您可以使用 選項,將不同的專案指定為啟始專案
。--startup-project
啟動專案和目標專案通常是相同的專案。 其為個別專案的一般案例是下列情況:
- EF Core 內容和實體類別位於 .NET 類別庫中。
- .NET 主控台應用程式或 Web 應用程式會參考類別庫。
您也可以將 移轉程式代碼放在與 EF Core 內容分開的類別庫中。
其他目標架構
CLI 工具會使用 .NET 專案和 .NET Framework 專案。 在 .NET Standard 類別庫中具有 EF Core 模型的應用程式可能沒有 .NET 或 .NET Framework 專案。 例如,這是 Xamarin 和 通用 Windows 平台 應用程式。 在這種情況下,您可以建立 .NET 控制台應用程式專案,其唯一目的是做為工具的啟動專案。 專案可以是沒有實際程式代碼的虛擬專案,只需要提供工具的目標。
Important
Xamarin.Android、Xamarin.iOS、Xamarin.Mac 現在已直接整合到 .NET 中(從 .NET 6 開始)作為 Android 的 .NET、適用於 iOS 的 .NET,以及適用於 macOS 的 .NET。 如果您要使用這些項目類型進行建置,則應該升級為 .NET SDK 樣式專案,以取得持續支援。 如需將 Xamarin 專案升級至 .NET 的詳細資訊,請參閱 從 Xamarin 升級至 .NET & .NET MAUI 檔。
為什麼需要虛擬專案? 如先前所述,工具必須於設計時間執行應用程式程序代碼。 為達此目的,他們需要使用 .NET 執行環境。 當EF Core 模型位於以 .NET 或 .NET Framework 為目標的專案時,EF Core 工具會從專案借用運行時間。 如果 EF Core 模型位於 .NET Standard 類別庫,則無法這麼做。 .NET Standard 不是實際的 .NET 實作;它是一組 .NET 實作必須支援的 API 規格。 因此,.NET Standard 不足以讓 EF Core 工具執行應用程式程式代碼。 您建立做為啟始專案的虛擬專案提供可載入 .NET Standard 類別庫的具體目標平臺。
ASP.NET Core 環境
您可以在命令列上指定 ASP.NET Core 項目的環境 。 這個和任何其他自變數會傳遞至 Program.CreateHostBuilder。
dotnet ef database update -- --environment Production
Tip
令牌 -- 會指示 dotnet ef 將後續的所有項目視為自變數,而不是嘗試將它們剖析為選項。 未使用 dotnet ef 的任何額外自變數會轉送至應用程式。
Common options
| Option | Short | Description |
|---|---|---|
--json |
顯示 JSON 輸出。 | |
--context <DBCONTEXT> |
-c |
要使用的 DbContext 類別。 僅限類別名稱,或具有命名空間的完全合格名稱。 如果省略此選項,EF Core 就會尋找內容類別。 如果有多個內容類別,此選項就是必要。 |
--project <PROJECT> |
-p |
目標專案之專案資料夾的相對路徑。 預設值是目前的資料夾。 |
--startup-project <PROJECT> |
-s |
啟動專案之專案資料夾的相對路徑。 預設值是目前的資料夾。 |
--framework <FRAMEWORK> |
目標 Framework 的目標 Framework Moniker。 當項目檔指定多個目標架構,而且您要選擇其中一個時,請使用 。 | |
--configuration <CONFIGURATION> |
組建組態,例如: Debug 或 Release。 |
|
--runtime <IDENTIFIER> |
要還原封裝的目標運行時間標識碼。 如需執行階段識別項 (RID) 清單,請參閱 RID 目錄。 | |
--no-build |
請勿建置專案。 預期在組建為最新狀態時使用。 | |
--help |
-h |
顯示說明資訊。 |
--verbose |
-v |
顯示詳細信息輸出。 |
--no-color |
不要將輸出著色。 | |
--prefix-output |
具有層級的前置詞輸出。 |
任何其他自變數會傳遞至應用程式。
dotnet ef database drop
刪除資料庫。
Options:
| Option | Short | Description |
|---|---|---|
--force |
-f |
Don't confirm. |
--dry-run |
顯示要卸除的資料庫,但不要卸除。 |
上面 列出常見的選項 。
dotnet ef database update
將資料庫更新為上次移轉或指定的移轉。
Arguments:
| Argument | Description |
|---|---|
<MIGRATION> |
目標移轉。 移轉可以依名稱或標識碼來識別。 數位0是特殊案例,表示 在第一次移 轉之前,並導致所有移轉都還原。 如果未指定任何移轉,命令會預設為上次移轉。 |
Options:
| Option | Description |
|---|---|
--connection <CONNECTION> |
資料庫的連接字串。 預設為或 AddDbContext中指定的 OnConfiguring 。 |
上面 列出常見的選項 。
下列範例會將資料庫更新為指定的移轉。 第一個使用移轉名稱,第二個使用移轉識別碼和指定的連線:
dotnet ef database update InitialCreate
dotnet ef database update 20180904195021_InitialCreate --connection your_connection_string
dotnet ef dbcontext info
取得型別 DbContext 的相關信息。
上面 列出常見的選項 。
dotnet ef dbcontext list
列出可用的 DbContext 類型。
上面 列出常見的選項 。
dotnet ef dbcontext optimize
產生 和 先行編譯查詢所使用的 DbContext 模型編譯版本。
如需詳細資訊,請參閱 編譯的模型 。
Options:
| Option | Short | Description |
|---|---|---|
--output-dir <PATH> |
-o |
要放入檔案的目錄。 路徑相對於項目目錄。 |
--namespace <NAMESPACE> |
-n |
用於所有產生的類別的命名空間。 預設為從根命名空間與輸出目錄加上 CompiledModels產生的 。 |
--suffix <SUFFIX> |
要附加至所有產生之檔案名稱的後綴。 例如 .g ,可以用來指出這些檔案包含產生的程序代碼 |
|
--no-scaffold |
不要產生已編譯的模型。 當已編譯的模型已經產生時,就會使用這個值。 | |
--precompile-queries |
產生先行編譯的查詢。 如果目標專案包含任何查詢,則這是 NativeAOT 編譯的必要專案 | |
--nativeaot |
在 NativeAOT 編譯和先行編譯查詢所需的編譯模型中產生其他程序代碼 |
Note
NativeAOT 支援和先行編譯查詢在 EF 9 中被視為實驗性,而且在下一個版本中可能會大幅變更。
上面 列出常見的選項 。
下列範例會使用預設設定,如果專案中只有一個 DbContext ,則適用:
dotnet ef dbcontext optimize
下列範例會針對具有指定名稱的內容優化模型,並將它放在個別的資料夾和命名空間中:
dotnet ef dbcontext optimize -o Models -n BlogModels -c BlogContext
dotnet ef dbcontext scaffold
為資料庫產生和實體類型的程序代碼 DbContext 。 為了讓此命令產生實體類型,資料庫數據表必須具有主鍵。
Arguments:
| Argument | Description |
|---|---|
<CONNECTION> |
資料庫的連接字串。 對於 ASP.NET Core 2.x 專案,此值可以是 name=<name of 連接字串>。 在此情況下,名稱來自為項目設定的組態來源。 |
<PROVIDER> |
要使用的提供者。 一般而言,這是 NuGet 套件的名稱,例如: Microsoft.EntityFrameworkCore.SqlServer。 |
Options:
| Option | Short | Description |
|---|---|---|
--data-annotations |
-d |
使用屬性來設定模型(可能的話)。 如果省略此選項,則只會使用 Fluent API。 |
--context <NAME> |
-c |
要產生之 DbContext 類別的名稱。 |
--context-dir <PATH> |
要放入類別檔案的 DbContext 目錄。 路徑相對於項目目錄。 命名空間衍生自資料夾名稱。 |
|
--context-namespace <NAMESPACE> |
要用於所 DbContext 產生類別的命名空間。 注意:覆寫 --namespace。 |
|
--force |
-f |
覆寫現有檔案。 |
--output-dir <PATH> |
-o |
要放置實體類別檔案的目錄。 路徑相對於項目目錄。 |
--namespace <NAMESPACE> |
-n |
用於所有產生的類別的命名空間。 預設為從根命名空間和輸出目錄產生。 |
--schema <SCHEMA_NAME>... |
要為其產生實體類型的數據表和檢視的架構。 若要指定多個架構,請針對每個架構重複 --schema 一次。 如果省略此選項,則會包含所有架構。 如果使用此選項,則即使未使用 --table 明確包含架構中的所有數據表和檢視,也會包含在模型中。 |
|
--table <TABLE_NAME>... |
-t |
要為其產生實體類型的數據表和檢視表。 若要指定多個資料表,請針對每個資料表重複 -t 或 --table 。 特定架構中的數據表或檢視表可以使用 'schema.table' 或 'schema.view' 格式來包含。 如果省略此選項,則會包含所有數據表和檢視表。 |
--use-database-names |
使用數據表、檢視、序列和數據行名稱,與資料庫中顯示的名稱完全相同。 如果省略此選項,資料庫名稱會變更為更符合 C# 名稱樣式慣例。 | |
--no-onconfiguring |
抑制在產生的OnConfiguring類別中產生 DbContext 方法。 |
|
--no-pluralize |
請勿使用複數化程式。 |
上面 列出常見的選項 。
下列範例會建構所有架構和數據表,並將新檔案 放入 Models 資料夾中。
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models
下列範例只會建立選取的數據表,並在具有指定名稱和命名空間的個別資料夾中建立內容:
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models -t Blog -t Post --context-dir Context -c BlogContext --context-namespace New.Namespace
下列範例會使用 Secret Manager 工具,從專案的組態集讀取 連接字串。
dotnet user-secrets set ConnectionStrings:Blogging "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Blogging"
dotnet ef dbcontext scaffold Name=ConnectionStrings:Blogging Microsoft.EntityFrameworkCore.SqlServer
下列範例會略過方法的 Scaffold。OnConfiguring 當您想要在 類別外部設定 DbContext 時,這非常有用。 例如,ASP.NET Core 應用程式通常會在 Startup.ConfigureServices 中加以設定。
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Integrated Security=true;" Microsoft.EntityFrameworkCore.SqlServer --no-onconfiguring
dotnet ef dbcontext script
從 DbContext 產生 SQL 腳本。 略過任何移轉。
Options:
| Option | Short | Description |
|---|---|---|
--output <FILE> |
-o |
要寫入結果的檔案。 |
上面 列出常見的選項 。
dotnet ef migrations add
新增移轉。
Arguments:
| Argument | Description |
|---|---|
<NAME> |
移轉的名稱。 |
Options:
| Option | Short | Description |
|---|---|---|
--output-dir <PATH> |
-o |
目錄會使用 來輸出檔案。 路徑相對於目標項目目錄。 預設為 「移轉」。 |
--namespace <NAMESPACE> |
-n |
要用於所產生類別的命名空間。 預設為從輸出目錄產生。 |
上面 列出常見的選項 。
dotnet ef migrations bundle
建立可執行檔以更新資料庫。
Options:
| Option | Short | Description |
|---|---|---|
--output <FILE> |
-o |
要建立之可執行文件的路徑。 |
--force |
-f |
覆寫現有檔案。 |
--self-contained |
此外,也會將 .NET 運行時間組合在一起,因此不需要安裝在機器上。 | |
--target-runtime <RUNTIME_IDENTIFIER> |
-r |
要配套的目標運行時間。 |
上面 列出常見的選項 。
dotnet ef migrations has-pending-model-changes
Note
此命令已在 EF Core 8.0 中新增。
檢查自上次移轉后是否已對模型進行任何變更。
Options:
上面 列出常見的選項 。
dotnet ef migrations list
列出可用的移轉。
Options:
| Option | Description |
|---|---|
--connection <CONNECTION> |
資料庫的連接字串。 預設為 AddDbContext 或 OnConfiguring 中指定的 。 |
--no-connect |
請勿連線到資料庫。 |
上面 列出常見的選項 。
dotnet ef migrations remove
拿掉最後一個移轉,復原針對最新移轉所完成的程式代碼變更。
Options:
| Option | Short | Description |
|---|---|---|
--force |
-f |
還原最新的移轉,復原針對最新移轉所做的程式代碼和資料庫變更。 如果連線到資料庫時發生錯誤,請繼續回復程式代碼變更。 |
上面 列出常見的選項 。
dotnet ef migrations script
從移轉產生 SQL 腳本。
Arguments:
| Argument | Description |
|---|---|
<FROM> |
開始移轉。 移轉可以依名稱或標識碼來識別。 數位0是特殊案例,表示 在第一次移轉之前。 預設為 0。 |
<TO> |
結束移轉。 預設為上次移轉。 |
Options:
| Option | Short | Description |
|---|---|---|
--output <FILE> |
-o |
要寫入腳本的檔案。 |
--idempotent |
-i |
產生可在任何移轉時在資料庫上使用的腳本。 |
--no-transactions |
請勿產生 SQL 交易語句。 |
上面 列出常見的選項 。
下列範例會建立 InitialCreate 移轉的腳本:
dotnet ef migrations script 0 InitialCreate
下列範例會在 InitialCreate 移轉之後建立所有移轉的腳本。
dotnet ef migrations script 20180904195021_InitialCreate