共用方式為


從 EF6 移植至 EF Core

Entity Framework Core,或簡稱 EF Core,是新式應用程式架構的 Entity Framework 的完全重寫。 由於基本變更,因此沒有直接升級路徑。 本檔的目的是提供將 EF6 應用程式移植到 EF Core 的端對端指南。

這很重要

開始移植程式之前,請務必驗證 EF Core 是否符合應用程式的數據存取需求。 您可以在 EF Core 檔中找到所需的一切。

警告

EF Core 僅支援新式 .NET,且不支援 .NET Framework。 因此,如果您的專案仍以 .NET Framework 為目標,您必須先移轉至新式 .NET,才能開始從 EF6 移轉至 EF Core。 請注意,EF6 支援新式 .NET,因此您可以先移轉至新式 .NET,同時保留 EF6,然後處理從 EF6 移轉至 EF Core 的作業。

升級的原因

所有新的 Entity Framework 開發都在 EF Core 中進行。 沒有計劃將任何新功能備份至 EF6。 EF Core 會在最新的 .NET 運行時間上執行,並充分利用運行時間、平臺特定 (例如 ASP.NET Core 或 WPF)和語言特定功能。 以下是您從升級中獲得的一些優點:

  • 利用 EF Core 中的持續 效能提升。 例如,一位從EF6移轉至EF Core 6的客戶,由於 查詢分割功能,使用大量查詢減少了40倍。 許多客戶只要移至最新的 EF Core,即可回報巨大的效能提升。
  • 在 EF Core 中使用 新功能 。 EF6 不會新增任何新功能。 所有新功能,例如 Azure Cosmos DB 提供者DbContextFactory,只會新增至 EF Core。 如需 EF6 與 EF Core 的完整比較,包括 EF Core 專屬的數個功能,請參閱: 比較 EF Core 和 EF6
  • 使用相依性插入將應用程式堆疊現代化,並順暢地整合數據存取與 gRPC 和 GraphQL 等技術。

移轉的注意事項

本文件使用詞彙 升級 ,以避免與 EF Core 功能中的詞彙 遷移混淆。 EF Core 中的遷移與 EF6 Code First 遷移 不兼容,因為已大幅改善遷移的處理方式。 不建議遷移你的移轉歷程紀錄,因此請規劃在 EF Core 中重新開始。 您可以從您的 EF6 移轉中保留程式碼基底和資料。 在 EF6 中套用最終移轉,然後在 EF Core 中建立初始移轉。 您將能夠在 EF Core 中持續追蹤歷程記錄。

升級步驟

升級路徑已分割成數份檔,這些檔是由升級階段和應用程式類型所組織。

判斷您的 EF Core「版本」

EF Core 如何與領域模型和資料庫實作搭配使用的方法有數種。 一般而言,大部分的應用程式都會遵循下列其中一種模式,以及您處理移植方式將取決於應用程式「風格」。

程式代碼作為事實來源 是一種方法,無論是透過數據屬性、Fluent 組態還是兩者的組合,都會透過程式代碼和類別建立模型。 資料庫一開始會根據 EF Core 中定義的模型產生,而且通常會透過移轉來處理進一步的更新。 這通常稱為「程式代碼優先」,但名稱並不完全正確,因為其中一種方法是從現有的資料庫開始、產生您的實體,然後使用程式代碼繼續維護。

資料庫作為真實來源方法牽涉到反向工程或從資料庫建構程序代碼。 進行架構變更時,程式代碼會重新產生或更新以反映變更。 這通常稱為「資料庫優先」。

最後,更進階的 混合式對應 方法遵循程式代碼和資料庫分開管理的理念,而EF Core 則用來對應這兩者。 這種方法通常會迴避移轉。

下表摘要說明一些高階差異:

方法 開發人員角色 資料庫管理員角色 移轉 腳手架 存放庫
先編碼 設計實體並驗證/自定義所生成的遷移 驗證架構定義和變更 每次提交 N/A 追蹤實體、DbContext 和遷移
資料庫優先 變更後進行逆向工程並驗證生成的實體 當資料庫變更為重新建構時通知開發人員 N/A 每次結構變更 追蹤延伸模組及部分類別,以進一步擴展已生成的實體
混合 更新 Fluent 組態設定,以在實體或資料庫發生變更時進行對應修正。 在資料庫變更時通知開發人員,以便更新實體和模型設定 N/A N/A 追蹤實體及資料庫上下文

相較於傳統程式代碼和資料庫方法,混合式方法是具有額外額外負荷的更進階方法。

瞭解離開EDMX的影響

EF6 支援名為 Entity Data Model XML (EDMX) 的特殊模型定義格式。 EDMX 檔案包含多個定義,包括概念架構定義 (CSDL)、對應規格 (MSL) 和儲存架構定義 (SSDL)。 EF Core 會透過內部模型圖形追蹤網域、對應和資料庫架構,且不支援EDMX格式。 許多部落格文章和文章錯誤地指出這表示 EF Core 只支援「程式代碼優先」。EF Core 支援上一節所述的三個應用程式模型。 您可以 藉由反向工程資料庫,在 EF Core 中重建模型。 如果您使用 EDMX 來呈現實體模型,請考慮使用開放原始碼 EF Core Power Tools 來提供 EF Core 類似的功能。

如需EDMX檔案支援不足之影響的詳細資訊,請參閱 移植EDMX 指南。

執行升級步驟

不需要移植整個應用程式。 EF6 和 EF Core 可以在相同的應用程式中執行(請參閱: 在同一個應用程式中使用 EF Core 和 EF6)。 若要將風險降至最低,您可以考慮:

  1. 若您還未將 EF6 移至 .NET Core,請考慮進行遷移。
  2. 將應用程式的一小部分移轉至 EF Core,並與 EF6 並存執行。
  3. 最後,將其餘程式代碼基底帶入 EF Core,並淘汰 EF6 程式代碼。

至於端口本身,總的來說,您將:

  1. 檢閱 EF6 與 EF Core 之間的行為變更
  2. 在 EF6 中執行最終的移轉。
  3. 建立EF Core 專案。
  4. 將程式代碼複製到新專案、執行反向工程或兩者的組合。
  5. 重新命名參考和實體,並更新行為:
    • System.Data.EntityMicrosoft.EntityFrameworkCore
    • 變更 DbContext 建構函式以取用選項和/或覆寫 OnConfiguring
    • DbModelBuilderModelBuilder
    • DbEntityEntry<T> 重新命名為 EntityEntry<T>
    • Database.Log 移至 Microsoft.Extensions.Logging (進階) 或 DbContextOptionsBuilder.LogTo (簡單) API
    • 針對 WithRequiredWithOptional 套用變更(請參閱 這裡
    • 更新驗證碼。 EF Core 中沒有內建的數據驗證,但您可以 自行進行
    • 請遵循從 EDMX 移植的任何必要步驟。
  6. 根據您的 EF Core 方法執行特定步驟:

有許多與所有方法相關的考慮,因此您也需要檢閱解決和避開EF6 與 EF Core 之間詳細差異的方法。