Condividi tramite


Novità di EF Core 10

EF Core 10 (EF10) è la versione successiva dopo EF Core 9 ed è pianificata per il rilascio a novembre 2025.

EF10 è disponibile come anteprima. Consulta le note di rilascio di .NET 10 per informazioni sull'ultima anteprima. Questo articolo verrà aggiornato man mano che vengono rese disponibili nuove versioni di anteprima.

Suggerimento

È possibile eseguire e fare il debug degli esempi scaricando il codice di esempio da GitHub. Ogni sezione seguente è collegata al codice sorgente specifico di tale sezione.

EF10 richiede .NET 10 SDK per compilare e richiede l'esecuzione del runtime .NET 10. EF10 non verrà eseguito nelle versioni precedenti di .NET e non verrà eseguito in .NET Framework.

Consiglio

La documentazione Novità viene aggiornata per ogni anteprima. Tutti gli esempi sono configurati per usare le build giornaliere di EF10 , che in genere hanno diverse settimane di lavoro completate rispetto all'anteprima più recente. È consigliabile usare le build quotidiane durante il test di nuove funzionalità in modo da non eseguire i test su bit non aggiornati.

Traduzione LINQ e SQL

Altri miglioramenti delle query

  • Traduzione per DateOnly.ToDateTime(timeOnly) (#35194, fornita da @mseada94).
  • Ottimizzazione per multipli LIMIT consecutivi (#35384), fornita da @ranma42).
  • Ottimizzazione per l'uso dell'operazione di Count su ICollection<T> (#35381), fornita da @ChrisJollyAU).

ExecuteUpdateAsync ora accetta una lambda regolare non espressione

Il ExecuteUpdateAsync può essere usato per esprimere operazioni di aggiornamento arbitrarie nel database. Nelle versioni precedenti, le modifiche da eseguire sulle righe del database sono state fornite tramite un parametro dell'albero delle espressioni; ciò ha reso piuttosto difficile compilare tali modifiche in modo dinamico. Si supponga, ad esempio, di voler aggiornare le visualizzazioni di un blog, ma anche il relativo nome in modo condizionale. Poiché l'argomento setter è un albero delle espressioni, è necessario scrivere codice come il seguente:

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

La creazione manuale degli alberi delle espressioni è complessa e soggetta a errori e rende questo scenario comune molto più difficile di quello che dovrebbe essere stato. A partire da EF 10, è ora possibile scrivere quanto segue:

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

Grazie a @aradalvand per proporre e spingere per questa modifica (in #32018).