今天我們宣佈EF Core 5.0釋出第五個預覽版。
1 先決條件
EF Core 5.0 的預覽版要求 .NET Standard 2.1。這意味著:
-
-
-
EF Core 5.0 在 .NET Core 3.1 上執行,不需要 .NET 5。根據 .NET 5 計劃的改變,這可能會在未來發生變化。
-
EF Core 5.0 執行在其他支援 .NET Standard 2.1 的平臺上。
-
EF Core 5.0 將不會在 .NET Standard 2.0 平臺上執行,包括 .NET Framework。
-
-
2 如何獲取EF Core 5.0預覽版
使用NuGet新增,例如新增SQL Server的提供程式:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 5.0.0-preview.5.20278.2
目前釋出的 EF Core包包括:
-
-
-
Microsoft.EntityFrameworkCore – 主程式
-
Microsoft.EntityFrameworkCore.SqlServer – SQL Server與SQL Azure提供者
-
Microsoft.EntityFrameworkCore.Sqlite – SQLite提供者
-
Microsoft.EntityFrameworkCore.Cosmos – Azure Cosmos DB提供者
-
Microsoft.EntityFrameworkCore.InMemory – 記憶體資料庫提供者
-
Microsoft.EntityFrameworkCore.Tools –Visual Studio Package Manager Console的 EF Core PowerShell命令
-
Microsoft.EntityFrameworkCore.Design – EF Core的設計時元件
-
Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite – SQL Server 空間型別支援
-
Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite – SQLite空間型別支援
-
Microsoft.EntityFrameworkCore.Proxies –延遲載入與變化跟蹤代理
-
Microsoft.EntityFrameworkCore.Abstractions – 分離的EF Core抽象
-
Microsoft.EntityFrameworkCore.Relational – 關聯式資料庫提供程式的共享EF Core元件
-
Microsoft.EntityFrameworkCore.Analyzers – EF Core的C#分析器
-
Microsoft.EntityFrameworkCore.Sqlite.Core – SQLite提供者(沒有打包的本機二進位制檔案)
-
-
我們還發布了Microsoft.Data.Sqlite.Core ADO.NET provider的預覽版。
3 安裝dotnet ef
與EF Core 3.0和3.1一樣,dotnet EF命令列工具不再包含在.NET Core SDK中。在執行EF Core的migration或scaffolding命令之前,必須將此包作為全域性或本地工具安裝。
若要全域性安裝預覽版工具,需要先使用以下命令解除安裝現有的版本:
dotnet tool uninstall --global dotnet-ef
然後,進行安裝:
dotnet tool install --global dotnet-ef --version 5.0.0-preview.5.20278.2
可以將此新版本的dotnet ef與使用較舊版本的EF Core執行時的專案一起使用。
4 EF Core 5.0預覽版的一些新功能
4.1 資料庫排序規則
現在可以在 EF Model中指定資料庫的預設排序規則。
modelBuilder.UseCollation("German_PhoneBook_CI_AS");
然後,Migrations將生成以下內容以在 SQL Server 上建立資料庫:
CREATE DATABASE [Test]
COLLATE German_PhoneBook_CI_AS;
也可以指定用於特定資料庫列的排序規則。
例如:
modelBuilder .Entity<User>() .Property(e => e.Name) .UseCollation("German_PhoneBook_CI_AS");
為了那些不使用migration的人,現在,在 DbContext scaffolding時,將從資料庫進行反向工程。最後,EF.Functions.Collate() 允許使用不同的排序規則進行臨時查詢。
例如:
context.Users.Single(e => EF.Functions.Collate(e.Name, "French_CI_AS") == "Jean-Michel Jarre");
這將生成 SQL Server 的以下查詢:
SELECT TOP(2) [u].[Id], [u].[Name] FROM [Users] AS [u] WHERE [u].[Name] COLLATE French_CI_AS = N'Jean-Michel Jarre'
請注意,臨時排序規則應謹慎使用,因為它們會對資料庫效能產生負面影響。
4.2 傳遞引數給IDesignTimeDbContextFactory
引數現在從命令列傳入IDesignTimeDbContextFactory 的 CreateDbContext 方法。
例如,為了指示這是開發構建,可以在命令列上傳遞自定義引數(例如 dev):
dotnet ef migrations add two --verbose --dev
然後,此引數將傳遞到工廠:
public class MyDbContextFactory : IDesignTimeDbContextFactory<SomeDbContext> { public SomeDbContext CreateDbContext(string[] args) => new SomeDbContext(args.Contains("--dev")); }
4.3 具有標識解析的無跟蹤查詢
現在,可以將無跟蹤查詢配置為執行標識解析。
例如,以下查詢將為每個Post建立新的Blog例項,即使每個Blog具有相同的主鍵也是如此。
context.Posts.AsNoTracking().Include(e => e.Blog).ToList();
但是,可以更改此查詢以確保只建立單個 Blog 例項,但代價通常是稍微慢一點,並且使用更多記憶體:
context.Posts.AsNoTracking().PerformIdentityResolution().Include(e => e.Blog).ToList();
請注意,這僅適用於無跟蹤查詢,因為所有跟蹤查詢都已表現出此行為。
4.4 持久化計算列
大多數資料庫允許在計算後儲存計算列的值。
雖然這佔用磁碟空間,但計算列在更新時只計算一次,而不是在每次檢索其值時計算。
這還允許對某些資料庫的列設定索引。
EF Core 5.0 允許將計算列配置為儲存列。
例如:
modelBuilder .Entity<User>() .Property(e => e.SomethingComputed) .HasComputedColumnSql("my sql", stored: true);
4.5 SQLite計算列
EF Core 現在支援 SQLite 資料庫的計算列。
5 有用的短連結
提供了以下短連結,便於參考和訪問。
-
-
- 主要文件:https://aka.ms/efdocs
- EF Core 的問題和功能請求:https://aka.ms/efcorefeedback
- EF路線圖:https://aka.ms/efroadmap
- EF Core 5.x 中的新增功能是什麼:https://aka.ms/efcore5
-