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
LIMIT
consecutivos (#35384), contribuído por @ranma42). - Otimização para a utilização da operação
Count
sobreICollection<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).