Entity Framework Core 與 MSBuild 的整合

從 EF 9 開始,您可以使用 MSBuild 工作,在建置專案或發佈專案時自動產生已編譯的模型和先行編譯查詢。 這主要是設計用來與 NativeAOT 發行平臺搭配使用。

警告

NativeAOT 支援和 MSBuild 整合是實驗性功能,還不適合生產環境使用。

安裝任務

要開始,請安裝 Microsoft。EntityFrameworkCore.Tasks NuGet 套件。 例如:

dotnet add package Microsoft.EntityFrameworkCore.Tasks

注意

需要以產生的檔案編譯的每個 專案都應該參考 NuGet 套件,它預設不會轉移。

使用任務

如果專案指定 <PublishAot>true</PublishAot> ,則根據預設,MSBuild 工作會在發佈期間產生已編譯的模型和先行編譯查詢。 否則,您可以設定下列屬性來控制產生行為:

MSBuild 屬性 描述
EFOptimizeContext 將其設定為 true 以啟用 MSBuild 整合。 僅限 EF Core 9-10;於 EF Core 11 中移除。
EFScaffoldModelStage 將其設定為 publishbuildnone,以指示將在哪個階段產生編譯的模型。 預設為 publish
EF查詢預編譯階段 (EFPrecompileQueriesStage) 將設置為 publishbuildnone 以指示先行編譯查詢生成的階段。 預設為 publish
DbContextName 要使用的衍生 DbContext 類別。 類別名稱或包含命名空間的完整限定名稱 如果省略此選項,EF Core 會針對專案中的所有內容類別執行產生。
EFTargetNamespace 用於所有產生的類別的命名空間。 如果省略此選項,EF Core 將會使用 $(RootNamespace)
EFOutputDir 在編譯專案之前放置所產生檔案的資料夾。 如果省略此選項,EF Core 將會使用 $(IntermediateOutputPath)
EFNullable 產生的程式碼會否使用可為 Null 的參考類型。 如果省略此選項,EF Core 將會使用 $(Nullable)

注意

從 EF Core 11 開始,該 EFOptimizeContext 特性已被 移除EFScaffoldModelStageEFPrecompileQueriesStage 屬性現在獨立運作,不需要額外的啟用標誌。

限制

  • publish 階段進行整合時,請在啟動專案中設定 rid(例如,<RuntimeIdentifier>win-x64</RuntimeIdentifier>)
  • 使用此方法時,無法指定不同的啟動專案,因為它會引進反向建置相依性。 這表示在設定方面,內容專案需要具備自給自足的能力,所以如果您的應用程式通常會在不同的專案中使用主機產生器來設定內容,您就需要在內容專案中實作IDesignTimeDbContextFactory<TContext>
  • 由於在產生已編譯模型之前,專案必須是可編譯的,因此此方法不支援通過部分方法實作來自定義已編譯的模型。
  • 目前,這一律會在 NativeAOT 所需的已編譯模型中產生額外的程式代碼。 如果您不打算啟用 NativeAOT,請使用 CLI 工具產生已編譯的模型。

其他資源