quinta-feira, 11 de junho de 2015

NHibernate ou Entity Framework?

Estava “passando o bastão” da manutenção de alguns softwares para outras equipes de desenvolvedores. Estes softwares foram desenvolvidos na plataforma .NET e com NHibernate. Uma pergunta que todos me fizeram foi: “Qual é melhor o NHibernate ou Entity Framework?” Obviamente, a minha resposta era recebida com suspeita por eu ter escolhido o NHibernate.

Quando inicie o desenvolvimento destes projetos existia apenas o Entity Framework 1.0 e recentemente, eu trabalhei em um projeto em que utilizamos o Entity Framework 4. Na versão 4 do Entity Framework é muito mais agradável pois foi implementado aprimoramentos como lazy loading transparente, classes POCO, o modelo “somente código” e etc. Todavia, existem muitos problemas e aprimoramentos que foram implementados com sucesso no Hibernate/NHibernate que ainda não foi abordados e/ou resolvidos pelo Entity Framework. O Entity Framework é um produto relativamente jovem e as novas mudanças implementadas apenas é um degrau de um longo caminho de amadurecimento similar ao NHibernate. A Microsoft sabe desta deficiência, e a equipe de marketing deve ter pensando em resolver apenas nomeando como versão “4.0” e passar uma idéia de produto maduro.

Desenvolvendo com Entity Framework eu encarei problemas difíceis de serem solucionados com esta ferramenta e que utilizando o NHibernate estes problemas teriam uma resolução natural e intuitiva até mesmo para um iniciante.

Eu não quero fazer uma longa lista de diferenças entre Entity Framework e NHibernate mas apenas mostrar onde se encontra as grandes diferenças entre as capacidades do Entity Framework 4 e NHibernate. Na maioria das vezes, a diferença está na capacidade de customizar e melhorar a performance.

Aqui está uma pequena lista dos pontos superiores do NHibernate:

Multi consultas / leitura em lotes – O NHibernate permite consulta em lotes com uma única ida e volta ao banco de dados, ao invés da ida e volta separadas para várias consultas.

SQL Batch - Scripts que realizam várias operações no banco de dados. O NHibernate pode ser configurado para escrever SQL em lotes (tirar proveito de TransactSQL ou PL/SQL por exemplo).

Batched collection loads - Quando você carregar uma collection do tipo lazy load, o NHibernate pode encontrar outras collections do mesmo tipo que não foram carregadas, e carregar todos elas em uma única viagem ao banco de dados. Esta é uma ótima maneira de evitar ter que lidar com SELECT N +1.

Collection lazy = "extra" - O NHibernate se adapta às operações que você pode executar sobre suas collections. Por exemplo, no sistema existe um método que realiza um “count” de dados de uma tabela de Clientes. Basicamente, você executa uma pesquisa no banco de dados de uma tabela de clientes com nomes que contenha ‘maria’ (select * from clientes where nome like ‘%maria%’) mas antes você deseja saber quantas ‘marias’ existem sem ter que carregar toda a tabela de clientes, então o NHibernate executa no banco de dados “select count(*) from Clientes where nome like ‘%maria%’) o Entity Framework executa “select * from Clientes where nome like ‘%maria%’ (sobrecarrega o banco, rede e a memória com dados que desnecessários para este tipo de requisito) e verifica quantos registros retornaram.

Filtros de recolha e colletions com paginação - Por exemplo, este recurso permite definir filtros de paginação em cima de suas coleções de entidades. Isso significa que você pode facilmente paginar o resultado de uma Grid sem ter que carregar todos os dados para a memória ou DataSet.

2nd level cachê (cache de nível 2) – Recentemente eu testemunhei na prática o quanto um sistema pode ganhar em desempenho com a ativação do cache no NHibernate.

Tweaking (ajustes) - Algo fundamental! Sempre que você precisar criar algo que vai além do que o NHibernate ou Entity Framework pode oferecer. Com NHibernate, em quase todos os casos, você tem um ponto de extensão que permite você acoplar o seu próprio código. Por exemplo, desenvolvemos o controle de acesso do usuário acoplado ao NHibernate. Com o Entity Framework você é completamente bloqueado para customizações deste tipo.

Integração e extensibilidade - NHibernate tem um monte de projetos de extensão, como NHibernate Pesquisa, Validator NHibernate, Shards NHibernate e etc. Isso não existe para o Entity Framework, e pior, não podem ser escritas na maioria das vezes.

Comunidade Hibernate – A união da comunidade Java e .NET.

Multi banco de dados – O NHibernate a maioria dos banco de dados de mercado (MySql, Oracle, MSSQLServer, SQLite e etc).

Outro ponto que para os meus projetos foram fundamentais (produtividade e manutenção): Inversion of Control (IoC) e Dependency injection (DI) com o Spring.NET

Por outro lado, no entanto:

O Entity Framework é da Microsoft. A Microsoft é um big player que costuma ser a última a largar e estar entre as primeiras na linha de chegada. Sendo assim, tudo o que a Microsoft faz merece atenção.

Conclusão:

Diante deste cenário, eu aconselho o uso do NHibernate. Por ser da Microsoft, o Entity Framework pode ficar melhor que o NHibernate mas ainda está muuuuuuuuuito longe de alcança-lo. Talvez, você pode se preocupar em manter a camada de acesso a dados bem separada e preparada para uma troca do NHibernate pelo Entity Framework nos próximos 5 anos.