Com a chegada do .Net Core muita coisa mudou, pensar que agora podemos rodar código C# em Linux e Mac é algo que mexe com a gente, e derruba muitos paradigmas do .Net, foi um alvoroço quando foi anunciado, mas nem tudo é um mar de rosas, para isso ser possível deve haver um desacoplamento completo do full framework, este qual estamos acostumados a usar desde sempre, que instalamos no windows e ficamos condenados a usar a plataforma windows pois está acoplado a algumas funções do SO, então em uma bela manha de sol, alguém teve a brilhante ideia de ter uma camada que padroniza as API’s para nós termos a liberdade de rodar código multiplataforma, deram o nome a essa iniciativa de .Net Standard (bem sugestivo).

Então com base nessa história acima o que restava era todo mundo portar seus códigos para .Net Standard se quiser ser lembrado em um futuro próximo, aí entra o NHibernate, e o começo de uma pequena jornada. Na primeira versão o .Net Standard 1.0 dava suporte a um conjunto pequeno de API’s do full framework e um deles que ficou de fora era o System.Data que o NHibernate faz uso, até aí não se tinha “prazo” para portar o NHibernate (a turma tava desanimada), então foi divulgado o que viria na próxima versão do .Net Stardand 2.0, e pá, muitas coisas que precisariam ser escritas para portar o NHibernate estavam presentes nessa nova versão, a galera então decidiu esperar, logo ao sair a versão .Net Standard 2.0 passei a acompanhar de perto o desenvolvimento do NHibernate (https://github.com/nhibernate/nhibernate-core) e um cara muito legal chamado Nathan Brown fez um Pull Request #3807 que quase todos os testes estão passando, ainda só não há suporte para bancos de dados Oracle, PostgreSQL, SQLServerCe, mas Firebird, MySql, Sql Server ODBC, SQLite e SQL Server 2012 os testes estão passando. Veja no print abaixo:

Vamos lá

Vamos criar um pequeno projeto para testar a execução do NHibernate no .Net Core 2;

Crie um projeto de Console Application (.NET Core), como mostrado na figura abaixo:

Agora vamos adicionar o pacote que nosso amigo Nathan Brown  publicou, abra as opções do Visual Studio, navegue até a configurações “Gerenciador de Pacote do Nuget” -> “Origem dos Pacotes” e adicione uma nova origem com o nome “NHibernate Core” e o endereço da origem “https://ci.appveyor.com/nuget/nhibernate-core-6cm11v2xdhud” clique em atualizar e depois em OK.

 

Agora vamos adicionar o pacote Nuget do NHibernate para nosso projeto de teste:

Clique com o botão direito em Referências no seu projeto e depois na opção “Gerenciar Pacotes NuGets”, na opção “Origem do Pacote” selecione a opção “NHibernate Core”, não se esqueça de selecionar a opção “Incluir pré-lançamento”, e depois na aba “Procurar” digite “NHibernate.Driver.SqlServer” e instale o pacote no seu projeto.

 

Na raiz do seu projeto adicione o arquivo “hibernate.cfg.xml” com o conteúdo abaixo e em propriedades do arquivo na opção “Copiar para Diretório de Saída” selecione a opção “Copiar sempre”.

[xml]

<?xml version="1.0" encoding="utf-8">
<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.connection_string">Data Source=.\SQLExpress;Initial Catalog=NHCore;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False</property>
<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
<mapping assembly="ConsoleApp1"/>
</session-factory>
</hibernate-configuration>
</configuration>

[/xml]

Vamos criar uma classe simples para o teste, a classe é um registro de Contato com Nome e E-mail como segue abaixo:

[csharp]

using System;

namespace ConsoleApp1
{
public class Contact
{
public virtual Guid? Id { get; set; }

public virtual string Name { get; set; }

public virtual string Email { get; set; }
}
}

[/csharp]

Não é possível utilizar o FluentNHibernate para fazer os mapeamentos das classes, ele ainda não foi portado para .NetStandard, então vamos usar o XML mesmo.
Adicione um arquivo XML na raiz do seu projeto com o nome “mapping.hbm.xml” com o seguinte conteúdo abaixo, não esqueça de alterar a opção “Ação de Compilação” para “Recurso inserido” das propriedades do arquivo.

[xml]

<?xml version="1.0" encoding="utf-8" >
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="ConsoleApp1" namespace="ConsoleApp1" auto-import="true">
<class name="Contact">
<id name="Id" type="Guid">
<generator class="guid.comb" />
</id>
<property name="Name" />
<property name="Email" />
</class>
</hibernate-mapping>

[/xml]

Voilá, finalmente o código… basta executar o programa abaixo e veremos o NHibernate funcionando no .Net Core 2.

[csharp]

using System;
using System.Linq;
using NHibernate.Cfg;
using NHibernate.Linq;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var configuration = new Configuration();
configuration.Configure();
var factory = configuration.BuildSessionFactory();
var session = factory.OpenSession();

Console.Write("Informe o nome do contato: ");
var name = Console.ReadLine();

Console.Write("Informe o E-mail: ");
var email = Console.ReadLine();

var contact = new Contact { Name = name, Email = email };
session.SaveOrUpdate(contact);
session.Flush();

Console.WriteLine("Perquisa de Contatos: ");
Console.Write("Informe o Nome:");
var search = Console.ReadLine();

var contacts = session.Query&amp;amp;amp;lt;Contact&amp;amp;amp;gt;()
.Where(p =&amp;amp;amp;gt; p.Name.Contains(search))
.ToList();

contacts.ForEach(x =&amp;amp;amp;gt;
{
Console.WriteLine($"{x.Name}: {x.Email}");
});

Console.ReadLine();

session.Close();
}
}
}

[/csharp]

O que o programa faz acima é cadastrar um contato e depois uma pesquisa nos contatos que já estão cadastrados. Como podemos ver neste teste com SQLServer já está funcionando, acho que em breve o pessoal vai estar liberado uma versão Beta ou até mesmo a versão final portada para .Net Standard 2.

Quem quiser baixar o código pode fazer o clone no GitHub no seguinte endereço:

https://github.com/cloviscoli/NHCore

O que acharam? Não deixe de comentar abaixo, abraço a todos.

 

1 Comentário. Deixe novo

  • Tiago de Oliveira
    10/09/2018 19:08

    Boa noite Clovis, gostaria de saber se existe alguma limitação pra rodar o nhibernate apontando par ao banco localizado no docker?

    Responder

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Preencha esse campo
Preencha esse campo
Digite um endereço de e-mail válido.
Você precisa concordar com os termos para prosseguir

Menu