從 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
參考 和Post
Blog
是可探索的,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。