共用方式為


Entity Framework Core 工具參考 - .NET CLI

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> 組建組態,例如: DebugRelease
--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

Additional resources