Entity Framework
Lições Aprendidas
Migração entre versões do Entity
Migração entre versões de alguma ferramenta é sempre um processo trabalhoso e que requer muita atenção e cuidado devido às possíveis break changes existentes nas funcionalidades.
Em um caso específico envolvendo a migração de versão de uma WebApi (Squad Gestão) de .NET 6 para .NET 8, foi aproveitada a janela para realizar atualizações nas bibliotecas utilizadas, visto que estavam muito defasadas e algumas até com CVE ativo, indicando possíveis vulnerabilidades. Dentre essas, foi feita a migração do Entity Framework da versão major 7 para a versão major 9, causando alguns erros em tempo de build que rapidamente foram sanados, permitindo que a aplicação voltasse a performar normalmente após a finalização da janela.
O ponto observado após um tempo foi que a utilização de métodos externos de filtro dentro das cláusulas .Where e .FirstOrDefault nas queries estava resultando em fluxos quebrados, devido ao Entity não ser capaz de traduzir o comportamento desses filtros em SQL puro para realizar a query de forma definitiva no banco.
Isso ocorreu porque, antes da versão major 8 do EF Core, as expressões externas passadas dentro de cláusulas Where podiam ser parcialmente avaliadas no lado do cliente (client-side evaluation). Dessa forma, quando a query LINQ não pudesse ser traduzida totalmente, essa parte seria processada no lado do cliente, causando uma queda significativa de performance, mas ainda atendendo à execução. Após a migração, as expressões passadas dentro das cláusulas Where precisam ser totalmente traduzíveis para SQL, a fim de garantir performance e evitar comportamentos inesperados, levantando uma exceção quando a tradução não ocorre com sucesso.
Dessa forma, ao seguir com migrações de versão do Entity em versões anteriores à 8, é importante verificar os fluxos que aplicam métodos de filtros customizados para que a aplicação não sofra com consequências tardias e inesperadas. Além disso, como solução definitiva, o que poderia previnir esses casos seria a existência de testes de repositórios cobrindo esses fluxos completamente ao realizar consultas no banco de fato, garantindo que o funcionamento do método está de acordo com o esperado.