從 EF6 移植到 EF Core 的詳細案例

本檔詳細說明 EF6 與 EF Core 之間的一些特定差異。 移植程式碼時,請參閱本指南。

設定資料庫連線

相較于 EF Core,EF6 如何連線到各種資料來源之間有數個差異。 請務必瞭解移植程式碼的時機。

  • 連線ion 字串 :EF Core 不會像 EF6 一樣直接支援不同連接字串的多個建構函式多載。 相反地,它依賴 DbCoNtextOptions 。 您仍然可以在衍生類型中提供多個建構函式多載,但必須透過選項對應連線。
  • 設定和快取 :EF Core 支援更強固且彈性地實作相依性插入,以及可連線到外部服務提供者的內部基礎結構。 這可由應用程式管理,以處理必須清除快取的情況。 EF6 版本有限,無法排清。
  • 組態檔 :EF6 支援透過可包含提供者的組態檔進行設定。 EF Core 需要直接參考提供者元件和明確提供者註冊(亦即 UseSqlServer )。
  • 連線處理站 :EF6 支援的連線處理站。 EF Core 不支援連線處理站,而且一律需要連接字串。
  • 記錄:一般而言, EF Core 中的記錄 功能更強固,而且具有多個微調組態選項。

慣例

EF6 支援的自訂 (「輕量型」) 慣例和模型慣例。 輕量型慣例類似于 EF Core 的 預先慣例模型設定 。 模型建置時支援其他慣例。

EF6 會在建置模型之後執行慣例。 EF Core 會在建置模型時套用它們。 在 EF Core 中,您可以使用 DbCoNtext 來分離使用中會話建置的模型。 建立使用慣例初始化的模型。

資料驗證

EF Core 不支援資料驗證,而且只會使用資料批註來建置模型和移轉。 大部分從 Web/MVC 到 WinForms 和 WPF 的用戶端程式庫都會提供要使用的資料驗證實作。

即將推出的功能

EF6 中有一些功能尚未存在於 EF Core 中,但在產品藍圖中。

  • EF6 支援每個具體資料表類型 (TPC) 以及「實體分割」。TPC 是 EF7 的藍圖。
  • EF6 中的預存程式對應 可讓您將建立、更新和刪除作業委派給預存程式。 EF Core 目前只允許對應至預存程式進行讀取。 建立、更新和刪除 (CUD) 支援位於 EF7 的藍圖上。
  • EF6 中的複雜類型 類似于 EF Core 中擁有的類型。 不過,EF7 中的值物件將會處理完整的功能集。

將 ObjectCoNtext 保留于後面

EF Core 會使用 DbCoNtext ObjectContext 而不是 。 您必須更新使用 IObjectCoNtextAdapter 的程式碼。 這有時用於具有 或 OverwriteChanges 合併選項的 PreserveChanges 查詢。 如需 EF Core 中的類似功能,請查看 Reload 方法。

模型組態

EF6 和 EF Core 中的模型設計方式有許多重要差異。 EF Core 缺乏條件式對應的完整支援。 它沒有模型產生器版本。

其他差異包括:

類型探索

在 EF Core 中,引擎會以三種方式探索實體類型:

  • DbSet<TEntity>DbContext 在您的 上公開 ,其中 TEntity 是您想要追蹤的類型。
  • Set<TEntity>從程式碼中的某個位置參考 。
  • 探索到的類型所參考的複雜型別會以遞迴方式探索(例如,如果您的 Blog 參考 和 PostBlog 是可探索的, Post 也會探索到)

不會 掃描元件是否有衍生類型。

對應

.Map()EF6 中的擴充功能已取代為 EF Core 中的多載和擴充方法。 例如,您可以使用 '。HasDiscriminator()' 設定每個階層的資料表 (TPH)。 請參閱: 模型繼承

繼承對應

EF6 支援每個階層的資料表 (TPH)、每一類型資料表 (TPT) 和每個具體類別的資料表 (TPC),並啟用階層不同層級不同口味的混合式對應。 EF Core 會繼續要求將繼承鏈結模型化為單向模型化(TPT 或 TPH),而計畫是在 EF7 中新增 TPC 的支援。

請參閱: 模型繼承

屬性

EF6 支援屬性上的索引屬性。 在 EF Core 中,它們會套用在類型層級,這應該讓需要複合索引的案例更容易。 EF Core 不支援具有資料批註的複合索引鍵(亦即使用 Order ColumnAttribute 搭配 KeyAttribute 使用 )。

如需詳細資訊,請參閱: 索引和條件約束

必要和選擇性

在 EF Core 模型建置中, IsRequired 只會設定主體端所需的專案。 HasForeignKey 現在會設定主體結束。 若要移植您的程式碼,改用會更直接 .Navigation().IsRequired() 。 例如:

EF6:

modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal(t => t.Instructor);

EF Core 6:

modelBuilder.Entity<Instructor>()
    .HasOne(t => t.OfficeAssignment)
    .WithOne(t => t.Instructor)
    .HasForeignKey<OfficeAssignment>();

modelBuilder.Entity<Instructor>()
    .Navigation(t => t.OfficeAssignment)
    .IsRequired();

modelBuilder.Entity<OfficeAssignment>()
    .Navigation(t => t.Instructor)
    .IsRequired();

根據預設,所有專案都是選擇性的,因此通常不需要呼叫 .IsRequired(false)

空間支援

EF Core 與協力廠商程式庫社群程式庫 NetTopologySuite 整合以提供空間支援。

獨立關聯

EF Core 不支援獨立關聯(EDM 概念,可讓兩個實體之間的關聯性與實體本身獨立定義)。 EF Core 中支援的類似概念是 陰影屬性

移轉

EF Core 不支援資料庫初始化運算式或自動移轉。 雖然 EF Core 中沒有 migrate.exe ,但您可以產生 移轉套件組合

Visual Studio 工具

EF Core 沒有設計工具,沒有從資料庫更新模型的功能,也沒有模型優先流程。 沒有反向工程精靈,也沒有內建範本。

雖然這些功能並未隨附于 EF Core,但有 OSS 社群專案可提供額外的工具。 具體而言, EF Core Power Tools 提供:

  • 支援資料庫專案 ( .dacpac ) 的 Visual Studio 內部反向工程。 包含以範本為基礎的程式碼自訂。
  • 使用模型圖形和腳本進行 DbCoNtext 的視覺檢查。
  • 使用 GUI 管理從 Visual Studio 內的移轉。

如需社群工具和延伸模組的完整清單,請參閱: EF Core 工具和延伸模組

變更追蹤

EF6 和 EF Core 處理變更追蹤的方式有數個差異。 下表摘要說明:

功能 EF6 EF Core
實體狀態 新增/附加整個圖形 支援流覽至中斷連結的實體
孤兒 保存 已刪除
已中斷連線、自我追蹤實體 支援 不支援
突變 在屬性上執行 在備份欄位上執行*
資料系結 .Local .Local 加號 .ToObservableCollection.ToBindingList
變更偵測 完整圖表 每個實體

* 根據預設,EF Core 不會觸發屬性通知,因此請務必 設定通知實體

請注意,EF Core 不會像 EF6 一樣頻繁地呼叫變更偵測。

EF Core 引進變更追蹤器的詳細 DebugView 資料。 若要深入瞭解,請參閱 變更追蹤器偵錯

查詢

EF6 有一些不存在於 EF Core 中的查詢功能。 包括:

  • 一些常見的 C# 函式和 SQL 函式對應。
  • 針對查詢和更新攔截命令樹狀結構。
  • 支援資料表值參數 (TVP)。

EF6 內建支援延遲載入 Proxy。 這是 EF Core 的加入套件(請參閱 延遲載入相關資料 )。

EF Core 可讓您使用 FromSQL 撰寫原始 SQL。