NHibernate no .NET Core 2 está quase pronto!

Quem me conhece sabe como sou fã no NHibernate, já utilizo há vários anos e já se comprovou como um ORM completo e confiável. Se você não conhece dê uma lida nestes sites para conhecer:

  1. http://nhibernate.info
  2. https://github.com/nhibernate

Mas mesmo gostando do NHibernate ele tinha se tornado um problema desde o lançamento do .NET Core, na verdade ele não era o problema mas sim a falta dele no ecossistema do .NET Core, a Microsoft lançou em conjunto com o .NET Core o Entity Framework Core, mas como pode ser visto no roadmap do EF ele ainda tem algumas features faltando para ser considerado um ORM completo.

A esperança era que em algum momento o NHibernate fosse portado para o .NET Core, a esperança era pequena porque a dependência por APIs do .NET Framework (full framework) era grande. Nesse vácuo outros frameworks começaram a se despontar como o Dapper, mas não dá para comparar as features que tinhamos no NHibernate com um micro ORM.

Quando a Microsoft anunciou o .NET Standard 2.0 as esperanças renasceram, a proposta de incorporar uma boa parte das APIs do .NET Framework no .NET Core era muito animadora, até gravamos um podcast sobre isso.

A partir desse anuncio fiquei monitorando o repositório do NHibernate Core para ver como estava o andamento do trabalho, até surgir o Pull Request NH-3807 — Support for .NET Core 2.0 que está ligado ao porte do NH para o .NET Core 2, fiquei animado e monitorando as mensagens do PR até ver que em agosto o Nathan Brown] postou uma mensagem no qual ele fala que os testes já estão passando no Windows com SQL Server e ele já estava disponibilizando os nugets em um feed público].

Na mesma semana fui testar e estava funcionando, vou mostrar para vocês como vocês podem reproduzir esse teste, porque se vocês forem como eu só vão acreditar vendo.

Mão na massa

Primeira coisa é necessário configurar no Visual Studio um novo Feed de Nuget, adicione a url https://ci.appveyor.com/nuget/nhibernate-core-6cm11v2xdhud como um source de nuget.

Tela do Visual Studio onde adiciona o novo feed

Adicione o pacote NHibernate.Driver.SqlServer, não se esqueça de pesquisar no feed que você acabou de adicionar, é ncessário marcar a opção pré-release.

Adicionando o pacote NHibernate.Driver.SqlServer

Depois de instalado vamos criar a configuração do NHibernate a moda antiga, com os benditos XML (eu costumo fazer mapeamento com o Fluent NHibernate, mas ele ainda não está portado). Para o nosso teste essa configuração será suficiente, primeiro vamos configurar a conexão com um arquivo hibernate.cfg.xml, esse arquivo deve estar na raiz do projeto e deve ser configurado nas propriedades do arquivo do projeto que o Build Action para None e Copy do output Directory para Copy Aways, o conteúdo do arquivo será o seguinte:

Vamos mapear uma entidade simples para inserir e logo depois ler os dados. A entidade e a tabela estão logo abaixo:

O arquivo de mapeamento tem o nome de Mapping.hbm.xml esse arquivo deve estar na raiz do projeto e deve ser configurado nas propriedades do arquivo do projeto que o Build Action para Embeded Resource e Copy do output Directory para Do not copy, o conteúdo do arquivo será o seguinte:

Chegando nesse ponto basta fazer a conexão para obter a sessão do NHibernate, fiz tudo em um console application bem simples só para demonstrar que ele insere e consegue selecionar valores.

Quando você executar o programa ele irá pedir um nome da cidade depois da população inserir e exibir as cidade que tem mais de 1000.

Como eu disse o teste é bem simples, mas já dá para ver que o trabalho está seguindo e que logo teremos tudo funcionando.

Isso tudo só foi possível por causa de 2 fatores:

  1. .NET Standard 2 está cobrindo muito mais APIs que o .NET Framewok já cobria. Com isso ficou muito mais fácil para a equipe do NHibernate portar para o .NET Core 2.0.
  2. Disponibilidade do Nathan Brown para portar, Thanks Nathan!

O código desse post pode ser visto aqui.

Recomendo dar uma lida na thread desse Pull Request no GitHub

Vamos torcer para sair logo! E aí o que acharam da novidade?