Compartilhar via


Novidades no EF Core 10

O EF Core 10 (EF10) é a próxima versão após o EF Core 9 e tem lançamento previsto para novembro de 2025.

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

Dica

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

O EF10 requer que o SDK do .NET 10 seja compilado e requer que o runtime do .NET 10 seja executado. O EF10 não será executado em versões anteriores do .NET e não será executado no .NET Framework.

Dica

Os documentos disponíveis em Novidades são atualizados para cada versão prévia. Todas as amostras estão configuradas para utilizar os builds diários do EF10, que geralmente têm semanas adicionais de trabalho concluído em comparação com a versão prévia mais recente. Incentivamos fortemente o uso das compilações diárias ao testar novos recursos para que você não esteja fazendo seus testes em relação a bits obsoletos.

Tradução de LINQ e SQL

Outras melhorias de consulta

  • Tradução para DateOnly.ToDateTime(timeOnly) (#35194, contribuído por @mseada94).
  • Otimização para múltiplas LIMIT consecutivas (nº 35384), contribuição de @ranma42).
  • Otimização para uso da operação de Count em ICollection<T> (nº 35381), contribuição de @ChrisJollyAU).

ExecuteUpdateAsync agora aceita um lambda regular que não é uma expressão

O ExecuteUpdateAsync pode ser usado para expressar operações arbitrárias de atualização no banco de dados. Nas versões anteriores, as alterações a serem executadas nas linhas do banco de dados eram fornecidas por meio de um parâmetro de árvore de expressão; isso tornou bastante difícil criar essas alterações dinamicamente. Por exemplo, vamos supor que queremos atualizar as visualizações de um blog e, de forma condicional, também seu nome. Como o argumento setters era uma árvore de expressão, código como o seguinte precisava ser escrito:

// 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. A partir do EF 10, agora você pode escrever o seguinte em vez disso:

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

Graças a @aradalvand por propor e promover essa alteração (no nº 32018).