共用方式為


Entity Framework Core 工具參考 - .NET CLI

Entity Framework Core 的命令列介面工具會執行設計時開發任務。 例如,他們會建立 移轉、套用移轉,並根據現有的資料庫為模型產生程序代碼。 這些命令是跨平臺 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

確認安裝

執行下列命令以確認 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 的任何額外自變數會轉送至應用程式。

常見選項

Option Short Description
--json 顯示 JSON 輸出。
--context <DBCONTEXT> -c 要使用的 DbContext 類別。 僅限類別名稱,或具有命名空間的完全合格名稱。 如果省略此選項,EF Core 就會尋找內容類別。 如果有多個內容類別,此選項就是必要。
--project <PROJECT> -p 目標專案專案目錄的相對路徑。 預設值是目前的資料夾。
--startup-project <PROJECT> -s 啟動專案的專案資料夾的相對路徑。 預設值是目前的資料夾。
--framework <FRAMEWORK> 目標框架的識別符號 當項目檔指定多個目標架構,而且您要選擇其中一個時,請使用 。
--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 不要確認。
--dry-run 顯示要刪除的資料庫,但不要刪除。
--connection <CONNECTION> 資料庫的連接字串。 預設為在 AddDbContextOnConfiguring 中指定的選項。 新增於 EF Core 11。

上面 列出常見的選項

dotnet ef database update

將資料庫更新為最後一次遷移或指定的遷移。

Arguments:

Argument Description
<MIGRATION> 目標遷移。 移轉可以依名稱或標識碼來識別。 數位0是特殊案例,表示 在第一次移 轉之前,並導致所有移轉都還原。 如果未指定任何移轉,命令會預設為上次移轉。

Options:

Option Description
--connection <CONNECTION> 資料庫的連接字串。 預設為在 AddDbContextOnConfiguring 中指定的選項。

上面 列出常見的選項

下列範例會將資料庫更新為指定的移轉。 第一個使用移轉名稱,第二個使用移轉識別碼和指定的連線:

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

下列範例會略過樣板生成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 還原最新的移轉,復原針對最新移轉所做的程式代碼和資料庫變更。 如果連線到資料庫時發生錯誤,僅回復代碼至前一版本。
--connection <CONNECTION> 資料庫的連接字串。 預設為在 AddDbContextOnConfiguring 中指定的選項。 新增於 EF Core 11。
--offline 刪除遷移,不需連接資料庫。 新增於 EF Core 11。

上面 列出常見的選項

Note

--offline--force選項不能同時使用,因為--force需要資料庫連接來確認遷移是否已經套用,才能撤銷。

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

其他資源