Sdílet prostřednictvím


Novinky v EF Core 10

EF Core 10 (EF10) je příští verze po EF Core 9 a plánuje se vydat v listopadu 2025.

EF10 je k dispozici ve verzi Preview. Informace o nejnovější verzi Preview najdete v poznámkách k verzi .NET 10. Tento článek se aktualizuje, jakmile budou dostupné nové verze Preview.

Spropitné

Ukázky můžete spustit a ladit stažením ukázkového kódu z GitHubu. Každá část níže odkazuje na zdrojový kód specifický pro tento oddíl.

EF10 vyžaduje sestavení sady .NET 10 SDK a vyžaduje spuštění modulu runtime .NET 10. EF10 se nespustí ve starších verzích .NET a nespustí se v rozhraní .NET Framework.

Rada

Dokumenty Co je nového se aktualizují pro každou verzi Preview. Všechny ukázky jsou nastavené tak, aby používaly denní buildy EF10, které mají obvykle několik dalších týdnů dokončené práce v porovnání s nejnovější verzí Preview. Důrazně doporučujeme používat denní verze při testování nových funkcí, abyste neprováděli testování proti zastaralým kódům.

Překlad LINQ a SQL

Další vylepšení dotazů

  • Translation for DateOnly.ToDateTime(timeOnly) (#35194, přispěl @mseada94).
  • Optimalizace pro více po sobě jdoucích LIMIT (#35384), na které přispěl @ranma42).
  • Optimalizace pro použití operace Count na ICollection<T> (č. 35381), přispěla @ChrisJollyAU).

ExecuteUpdateAsync nyní přijímá běžnou, ne-výrazovou lambda funkci.

ExecuteUpdateAsync lze použít k vyjádření libovolných operací aktualizace v databázi. V předchozích verzích byly změny provedené na řádcích databáze poskytovány prostřednictvím parametru stromu výrazu; díky tomu bylo poměrně obtížné tyto změny dynamicky sestavovat. Předpokládejme například, že chceme aktualizovat zobrazení blogu, ale podmíněně také jeho název. Protože argument setters byl strom výrazů, bylo třeba napsat kód, například následující:

// 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);

Ruční vytváření stromů výrazů je složité a náchylné k chybám a tento běžný scénář je mnohem obtížnější, než by to mělo být. Od EF 10 teď můžete napsat následující:

await context.Blogs.ExecuteUpdateAsync(s =>
{
    s.SetProperty(b => b.Views, 8);
    if (nameChanged)
    {
        s.SetProperty(b => b.Name, "foo");
    }
});

Díky @aradalvand za navržení a prosazení této změny (v #32018).