Partilhar via


O que há de novo no EF Core 10

O EF Core 10 (EF10) é o próximo lançamento após o EF Core 9 e está programado para ser lançado em novembro de 2025.

O EF10 está disponível como pré-visualização. Consulte notas de versão do .NET 10 para obter informações sobre a pré-visualização mais recente. Este artigo será atualizado à medida que novas versões de visualização forem disponibilizadas.

Dica

Você pode executar e depurar os exemplos baixando o código de exemplo do GitHub. Cada seção abaixo tem links para o código-fonte específico dessa seção.

O EF10 requer o SDK do .NET 10 para compilar e requer o tempo de execução do .NET 10 para executar. O EF10 não será executado em versões anteriores do .NET e não será executado no .NET Framework.

Dica

Os documentos Novidades são atualizados para cada versão de pré-visualização. Todas as amostras são configuradas para usar as compilações diárias EF10, que geralmente têm várias semanas adicionais de trabalho concluído em comparação com a visualização mais recente. Recomendamos fortemente o uso das compilações diárias ao testar novos recursos para que você não esteja fazendo seus testes contra bits obsoletos.

Tradução LINQ e SQL

Outras melhorias na consulta

  • Tradução para DateOnly.ToDateTime(timeOnly) (#35194, contribuição de @mseada94).
  • Otimização para múltiplos LIMITconsecutivos (#35384), contribuído por @ranma42).
  • Otimização para a utilização da operação Count sobre ICollection<T> (#35381), contribuída por @ChrisJollyAU).

ExecuteUpdateAsync agora aceita um lambda regular e sem expressão

O ExecuteUpdateAsync pode ser usado para expressar operações de atualização arbitrárias no banco de dados. Nas versões anteriores, as alterações a serem realizadas nas linhas do banco de dados eram fornecidas por meio de um parâmetro de árvore de expressão; Isso dificultou bastante a construção dessas mudanças dinamicamente. Por exemplo, vamos supor que queremos atualizar as visualizações de um blog, mas condicionalmente também seu nome. Como o argumento setters era uma árvore de expressão, códigos como os seguintes precisavam ser escritos:

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

Criar árvores de expressão manualmente é complicado e propenso a erros, e tornou esse cenário comum muito mais difícil do que deveria ter sido. A partir do EF 10, agora você pode escrever o seguinte:

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

Obrigado a @aradalvand por propor e pressionar por esta mudança (em #32018).