Dela via


Nyheter i EF Core 10

EF Core 10 (EF10) är nästa version efter EF Core 9 och är planerad att släppas i november 2025.

EF10 är tillgängligt som dagliga versioner som innehåller alla de senaste EF10-funktionerna och API-justeringarna. Exemplen här använder dessa dagliga versioner.

Tips

Du kan köra och felsöka i exemplen genom att ladda ned exempelkoden från GitHub. Varje avsnitt nedan länkar till källkoden som är specifik för det avsnittet.

EF10 kräver att bygga med .NET 10 SDK och att köras med .NET 10 runtime. EF10 körs inte på tidigare .NET-versioner och körs inte på .NET Framework.

Tips

Dokumenten Nyheter uppdateras för varje förhandsversion. Alla prover är konfigurerade för att använda EF10 dagliga byggversioner, som vanligtvis inkluderar flera ytterligare veckors slutfört arbete jämfört med den senaste förhandsversionen. Vi rekommenderar starkt att du använder de dagliga versionerna när du testar nya funktioner så att du inte testar mot inaktuella bitar.

LINQ- och SQL-översättning

Andra frågeförbättringar

  • Översättning för DateOnly.ToDateTime(timeOnly) (#35194, bidragit av @mseada94).
  • Optimering för flera på varandra följande LIMIT(#35384), bidrag av @ranma42.
  • Optimering för användning av Count operation på ICollection<T> (#35381), bidragit av @ChrisJollyAU).

ExecuteUpdateAsync accepterar nu en vanlig lambda utan uttryck

ExecuteUpdateAsync kan användas för att uttrycka godtyckliga uppdateringsåtgärder i databasen. I tidigare versioner tillhandahölls de ändringar som skulle utföras på databasraderna via en uttrycksträdsparameter. Detta gjorde det ganska svårt att bygga dessa ändringar dynamiskt. Anta till exempel att vi vill uppdatera en bloggs visningar, men konditionellt även dess namn. Eftersom argumentet setters var ett uttrycksträd måste kod som följande skrivas:

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

Att manuellt skapa uttrycksträd är komplicerat och felbenäget och gjorde det här vanliga scenariot mycket svårare än det borde ha varit. Från och med EF 10 kan du nu skriva följande i stället:

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

Tack vare @aradalvand för att föreslå och driva på för den här ändringen (i #32018).