EF Core 10 的新功能
EF Core 10 (EF10) 是 EF Core 9 之後的下一個版本,並排定於 2025 年 11 月發行。
EF10 可作為預覽版。 請參閱 .NET 10 版本資訊 取得最新預覽的相關信息。 隨著提供新的預覽版本,本文將會更新。
提示
您可以下載 GitHub 上的範例程式代碼,然後執行並偵錯這些範例。 下方的每個區段都會連結到該區段專屬的原始程式碼。
EF10 需要 .NET 10 SDK 才能建置,而且需要 .NET 10 運行時間才能執行。 EF10 不會在舊版 .NET 上執行,也不會在 .NET Framework 上執行。
提示
每次預覽都會更新「新功能說明」文件。 所有範例都設置為使用EF10的每日版本,相較於最新的預覽版本,通常會多出幾週已完成的工作。 我們強烈建議您在測試新功能時使用每日構建版本,以免對過時的版本進行測試。
LINQ 和 SQL 翻譯
其他查詢改進
- DateOnly.ToDateTime(timeOnly) 的翻譯 (#35194,由 @mseada94貢獻。
- 針對多個連續
LIMIT
的優化(#35384),由@ranma42貢獻。 - 針對
Count
上的ICollection<T>
作業(#35381)所做的優化,由 @ChrisJollyAU貢獻。
ExecuteUpdateAsync 現在接受一般、非表達式的 lambda 函式
ExecuteUpdateAsync 可用來表示資料庫中的任意更新作業。 在舊版中,會透過表達式樹狀結構參數來提供資料庫數據列上要執行的變更;這讓動態建置這些變更相當困難。 例如,假設我們想要更新部落格的瀏覽量,但我們也可能會有條件地更新其名稱。 由於 setters 自變數是表達式樹狀結構,因此需要撰寫下列程式代碼:
// Base setters - update the Views only
Expression<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>> setters =
s => s.SetProperty(b => b.Views, 8);
// Conditionally add SetProperty(b => b.Name, "foo") to setters, based on the value of nameChanged
if (nameChanged)
{
var blogParameter = Expression.Parameter(typeof(Blog), "b");
setters = Expression.Lambda<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>>(
Expression.Call(
instance: setters.Body,
methodName: nameof(SetPropertyCalls<Blog>.SetProperty),
typeArguments: [typeof(string)],
arguments:
[
Expression.Lambda<Func<Blog, string>>(Expression.Property(blogParameter, nameof(Blog.Name)), blogParameter),
Expression.Constant("foo")
]),
setters.Parameters);
}
await context.Blogs.ExecuteUpdateAsync(setters);
手動建立表達式樹狀結構很複雜且容易發生錯誤,而且使得此常見案例比應該更困難。 從 EF 10 開始,您現在可以改為撰寫下列命令:
await context.Blogs.ExecuteUpdateAsync(s =>
{
s.SetProperty(b => b.Views, 8);
if (nameChanged)
{
s.SetProperty(b => b.Name, "foo");
}
});
感謝 @aradalvand 提出和推動這項變更 (在 #32018中)。