NHibernate - Hibernate Fluente

Neste capítulo, iremos cobrir o NHibernate fluente. O Fluent NHibernate é outra forma de mapeamento ou você pode dizer que é uma alternativa aos arquivos de mapeamento XML padrão do NHibernate. Em vez de escrever XML(.hbm.xml files)documentos. Com a ajuda do Fluent NHibernate, você pode escrever mapeamentos em código C # fortemente tipado.

  • No Fluent NHibernate, os mapeamentos são compilados junto com o restante do seu aplicativo.

  • Você pode facilmente alterar seus mapeamentos, assim como o código do aplicativo e o compilador falhará em qualquer erro de digitação.

  • Possui um sistema de configuração convencional, onde você pode especificar padrões para substituir convenções de nomenclatura e muitas outras coisas.

  • Você também pode definir como as coisas devem ser nomeadas uma vez, então o Fluent NHibernate faz o resto.

Vamos dar uma olhada em um exemplo simples criando um novo projeto de console. Neste capítulo, usaremos um banco de dados simples no qual temos uma tabela Cliente simples, conforme mostrado na imagem a seguir.

Instale o Fluent NHibernate

A primeira etapa é iniciar o Fluent NHibernate é instalar o pacote Fluent NHibernate. Então abra oNuGet Package Manager Console e digite o seguinte comando.

PM> install-package FluentNHibernate

Depois de instalado com êxito, você verá a seguinte mensagem.

Vamos adicionar uma classe de modelo simples de Cliente e o programa a seguir mostra a implementação da classe Cliente.

using System; 
using System.Collections.Generic; 
using System.Linq;
using System.Text; 
using System.Threading.Tasks;

namespace FluentNHibernateDemo { 
   class Customer { 
      public virtual int Id { get; set; } 
      public virtual string FirstName { get; set; } 
      public virtual string LastName { get; set; } 
   } 
}

Agora precisamos criar mapeamentos usando NHibernate fluente, então adicione mais uma classe CustomerMapno seu projecto. Aqui está a implementação da classe CustomerMap.

using FluentNHibernate.Mapping; 
using System; 
using System.Collections.Generic; 
using System.Linq; using System.Text; 
using System.Threading.Tasks;

namespace FluentNHibernateDemo { 
   class CustomerMap : ClassMap<Customer> { 
      public CustomerMap() { 
         Id(x => x.Id); 
         Map(x => x.FirstName); 
         Map(x => x.LastName); 
         Table("Customer"); 
      } 
   }
}

Vamos adicionar outra classe NHibernateHelper em que definiremos diferentes configurações.

using FluentNHibernate.Cfg; 
using FluentNHibernate.Cfg.Db; 
using NHibernate; 
using NHibernate.Tool.hbm2ddl;

namespace FluentNHibernateDemo { 

   public class NHibernateHelper { 
	
      private static ISessionFactory _sessionFactory;
		
      private static ISessionFactory SessionFactory { 
         get { 
            if (_sessionFactory == null)
            InitializeSessionFactory(); return _sessionFactory; 
         } 
      }
   
      private static void InitializeSessionFactory() { 
         _sessionFactory = Fluently.Configure() 
			
         String Data Source = asia13797\\sqlexpress;
         String Initial Catalog = NHibernateDemoDB;
         String Integrated Security = True;
         String Connect Timeout = 15;
         String Encrypt = False;
         String TrustServerCertificate = False;
         String ApplicationIntent = ReadWrite;
         String MultiSubnetFailover = False;
			
         .Database(MsSqlConfiguration.MsSql2008 .ConnectionString( 
            @"Data Source + Initial Catalog + Integrated Security + Connect Timeout
            + Encrypt + TrustServerCertificate + ApplicationIntent + 
            MultiSubnetFailover") .ShowSql() ) 
				
         .Mappings(m => m.FluentMappings
         .AddFromAssemblyOf<Program>()) 
         .ExposeConfiguration(cfg => new SchemaExport(cfg) 
         .Create(true, true)) 
         .BuildSessionFactory(); 
      }
		
      public static ISession OpenSession() { 
         return SessionFactory.OpenSession(); 
      } 
   }
}

Agora vamos passar para o Program.cs arquivo no qual iniciaremos uma sessão e, em seguida, criaremos um novo cliente e salvaremos esse cliente no banco de dados, conforme mostrado abaixo.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks;

namespace FluentNHibernateDemo { 
   class Program { 
	
      static void Main(string[] args) { 
		
         using (var session = NHibernateHelper.OpenSession()) { 
			
            using (var transaction = session.BeginTransaction()) { 
               var customer = new Customer { 
                  FirstName = "Allan", 
                  LastName = "Bomer" 
               }; 
					
               session.Save(customer); 
               transaction.Commit();
               Console.WriteLine("Customer Created: " + customer.FirstName + "\t" +
                  customer.LastName); 
            } 
				
            Console.ReadKey(); 
         } 
      } 
   } 
}

Vamos executar seu aplicativo e você verá a seguinte saída.

if exists (select * from dbo.sysobjects where id = object_id(N'Customer') and
   OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Customer

create table Customer (
   Id INT IDENTITY NOT NULL,
   FirstName NVARCHAR(255) null,
   LastName NVARCHAR(255) null,
   primary key (Id)
)

NHibernate: INSERT INTO Customer (FirstName, LastName) VALUES (@p0, @p1); 
   select SCOPE_IDENTITY();@p0 = 'Allan' [Type: String (4000)], 
   @p1 = 'Bomer' [Type: String (4000)]
   Customer Created: Allan Bomer

Como você pode ver, o novo cliente foi criado. Para ver o registro do cliente, vamos ao banco de dados e ver os dados de exibição e você verá que 1 cliente foi adicionado.