AspNet Core 3.1 e Oracle

Iniciei em um projeto Web Api com Asp Net Core 3.1 e Oracle 19c em fevereiro deste ano, num projeto que gerencia toda a parte administrativa da empresa. A ideia de usar o ASP.NET Core 3.1 começou pois o projeto estava sendo criado do zero e usar tecnologias mais recentes seria um desafio novo. A empresa já usa Oracle há bastante tempo e por isso resolvemos manter a tecnologia porque usar outro banco não seria o ideal, pois teria que gerenciar dois SGBDs, fazer consulta em um banco e inserir em outro, certamente aumentaria a complexidade e tempo de desenvolvimento.

Fui em busca de um ORM para fazer a conexão com o banco e realizar as operações básicas de CRUD. A principio, pensei no Entity Framework Core, mas ao desenvolver uma primeira prova de conceito, percebi o seguinte problema:

Enquanto escrevo esse artigo, já no inicio deste mês, saiu uma versão beta do Entity Framework Core para Oracle, ainda instável por ser beta, mas uma opção para testar depois.

Antes de sair a versão beta do EF Core procurei outras formas de resolver esse problema. Uma das soluções que encontrei foi da empresa Devart, chamada dotNet for Oracle. Não cheguei a testar, mas pelo pouco que li da documentação, já resolveria meu problema, mas pelo fato de ser pago, pensei em procurar um pouco mais.

Foi então que encontrei esse repositório que, juntamente com o Dapper, realiza as operações básicas de CRUD para o Oracle. A idéia desse repositório é fazer o que o Dapper.Contrib faz, só que neste caso a implementação é dedicada para funcionar com o Oracle.

Com isso, resolvi fazer um fork deste projeto e fazer algumas mudanças como:

  1. Focar somente no Oracle.
  2. Portabilidade com .Net Standard 2.0
  3. Remover projeto CodeGenerator que não seria utilizado.
  4. Alterar alguns métodos e remover outros.
  5. Criar método de paginação com base na query.

Com isso já consegui resolver muita coisa. No entanto, surgiu um problema: para quem já usou Dapper, sabe que ele não é bom para resolver relacionamentos complexos entre objetos. A implementação do mecanismo de relacionamento 1:1 é satisfatória, mas quando se trata de um objeto que tem vários relacionamentos, ou ainda relacionamentos 1:n, ele não é muito bom. Um amigo então sugeriu o uso do Slapper.AutoMapper, que ajudou a resolver essa questão dos relacionamentos.

  • Esse é o projeto que fiz as alterações.
  • Publiquei também no nuget para quem quiser usar futuramente.

É notável a questão da maturidade do ASP.NET Core pós versão 3. Como em anos anteriores, a Oracle ainda está um pouco para trás na questão de integrar suas bibliotecas cliente com as tecnologias mais recentes, mas o experimento foi sólido e sinto confiança de finalizar esta aplicação e publicá-la em produção.

Fica aqui meu agradecimento ao tutor e amigo Leonel Sanches pela revisão deste primeiro artigo que escrevo.