EF Core 3.x - Atualizações recentes e seus Impactos


Hoje veremos uma lista das principais atualizações incluidas no EF Core a partir da versão 3.0 e o impacto que elas terão quando da migração de projetos antigos.

Atualmente estamos na versão 3.1.1 do EF Core, e, a partir da versão 3.0 muitas alterações que foram incluídas podem impactar projetos que forem migrados de versões mais antigas.

Vou apresentar um resumo das principais alterações e do impacto que elas podem causar em projetos antigos.(todas retiradas da documentação oficial)

O objetivo é alertá-lo para você ficar atento a fim de que sua aplicação continue funcionando após migrar para a nova versão.

Nesta primeira parte vou iniciar com 5 atualizações que possuem um alto impacto em projetos que forem migrados.

1- Consultas LINQs não são mais avaliadas no Cliente

Como era antes da versão 3.0:

Quando o EF Core não podia converter uma expressão que fazia parte de uma consulta para SQL ou parâmetro, ele automaticamente avaliava a expressão no cliente. Por padrão, a avaliação no cliente de expressões potencialmente dispendiosas apenas disparava um alerta se houvesse um erro.
 

Como é agora:

Agora o EF Core apenas permite que expressões na projeção de nível superior (a última chamada Select() na consulta) sejam avaliadas no cliente. Quando expressões em qualquer outra parte da consulta não podurem ser convertidas em SQL ou em um parâmetro, será lançada uma exceção.

A avaliação automática de consultas pelo cliente permite que várias consultas sejam executadas, mesmo que partes importantes delas não possam ser convertidas. Esse comportamento pode resultar em comportamento inesperado e potencialmente perigoso que pode se tornar evidente apenas em produção

Se não for possível converter totalmente uma consulta, reescreva a consulta em uma forma que possa ser convertida ou use AsEnumerable(), ToList() ou algo semelhante para explicitamente trazer dados de volta para o cliente em um local em que possam ser processados usando o LINQ to Objects.

2- O EF Core 3.0 tem como destino o .NET Standard 2.1

Como era antes da versão 3.0:

Antes o EF Core tinha como destino o .NET Standard 2.0 e era executado em todas as plataformas que dão suporte a esse padrão, incluindo o .NET Framework.
 

Como é agora:

Agora o EF Core tem como destino o .NET Standard 2.1 e será executado em todas as plataformas que dão suporte a esse padrão. Isso não inclui o .NET Framework.

Isso faz parte de uma decisão estratégica nas tecnologias .NET para concentrar os esforços no .NET Core e em outras plataformas .NET modernas, como o Xamarin.

3- O EF Core não faz mais parte da estrutura compartilhada do ASP.NET Core

Como era antes da versão 3.0:

Quando você adicionava uma referência de pacote a Microsoft.AspNetCore.App ou Microsoft.AspNetCore.All, ela incluia o EF Core e alguns provedores de dados do EF Core, como o provedor do SQL Server.
 

Como é agora:

Agora a estrutura compartilhada do ASP.NET Core não inclui o EF Core nem provedores de dados do EF Core.

Antes dessa alteração, obter o EF Core exigia diferentes etapas, dependendo de se o aplicativo tinha como destino o ASP.NET Core e o SQL Server ou não. Além disso, atualizar o ASP.NET Core forçou a atualização do EF Core e do provedor do SQL Server, o que nem sempre é desejável.

Com essa alteração, a experiência de obter o EF Core é a mesma em todos os provedores, implementações de .NET com suporte e tipos de aplicativos. Os desenvolvedores agora também podem controlar exatamente quando o EF Core e os provedores de dados do EF Core são atualizados.

Para usar o EF Core em um aplicativo ASP.NET Core 3.0 ou qualquer outro aplicativo com suporte, adicione explicitamente uma referência de pacote ao provedor de banco de dados do EF Core que seu aplicativo usará.

4 - A ferramenta dotnet ef não é mais parte do SDK do .NET Core

Como era antes da versão 3.0:

Antes a ferramenta dotnet ef era incluída no SDK do .NET Core e ficava prontamente disponível para uso na linha de comando de qualquer projeto sem a necessidade de etapas adicionais.
 

Como é agora:

Agora o SDK do .NET não inclui a ferramenta dotnet ef, portanto, antes que você possa usá-la, você precisa instalá-la explicitamente como uma ferramenta local ou global.

Essa alteração permite distribuir e atualizar dotnet ef como uma ferramenta de CLI do .NET regular no NuGet, consistente com o fato de que o EF Core 3.0 também é sempre distribuído como um pacote do NuGet.

Para conseguir gerenciar migrações ou usar o scaffold no DbContext, instale dotnet-ef como uma ferramenta global usando este comando:

dotnet tool install --global dotnet-ef

5 - Os comandos FromSql, ExecuteSql e ExecuteSqlAsync foram renomeados

Como era antes da versão 3.0:

Esses nomes de métodos eram sobrecarregados para trabalhar com uma cadeia de caracteres normal ou uma cadeia de caracteres que deveria ser interpolada em SQL e parâmetros.
 

Como é agora:

Agora devemos usar FromSqlRaw, ExecuteSqlRaw, e ExecuteSqlRawAsync para criar uma consulta parametrizada em que os parâmetros são passados separadamente da cadeia de consulta. Ex:

Ex: context.Products.FromSqlRaw("SELECT * FROM Products WHERE Name = {0}",product.Name);

Use FromSqlInterpolated, ExecuteSqlInterpolated, e ExecuteSqlInterpolatedAsync para criar uma consulta parametrizada em que os parâmetros são passados como parte de uma cadeia de consulta interpolada.

Ex: context.Products.FromSqlInterpolated($"SELECT * FROM Products WHERE Name = {product.Name}");
 

Sobrecargas de método como essas tornam muito fácil chamar acidentalmente o método de cadeia de caracteres bruta quando a intenção era para chamar o método de cadeia de caracteres interpolada e vice-versa. Isso pode resultar em consultas não parametrizadas.

Assim, essas são as 5 principais mudanças que possuem um alto impacto em um projeto que for migrado para a versão 3.1 do EF Core. Por isso se você tem algum projeto e vai migrar para a nova versão esteja atento.

Até o próximo artigo.

Referências:


José Carlos Macoratti