NHibernate - Hibernación fluida

En este capítulo, cubriremos NHibernate fluido. Fluent NHibernate es otra forma de mapeo o puede decir que es una alternativa a los archivos de mapeo XML estándar de NHibernate. En lugar de escribir XML(.hbm.xml files)documentos. Con la ayuda de Fluent NHibernate, puede escribir asignaciones en código C # fuertemente tipado.

  • En Fluent NHibernate, las asignaciones se compilan junto con el resto de su aplicación.

  • Puede cambiar fácilmente sus asignaciones al igual que el código de su aplicación y el compilador fallará en cualquier error tipográfico.

  • Tiene un sistema de configuración convencional, donde puede especificar patrones para anular las convenciones de nomenclatura y muchas otras cosas.

  • También puede establecer cómo se deben nombrar las cosas una vez, luego Fluent NHibernate hace el resto.

Echemos un vistazo a un ejemplo simple creando un nuevo proyecto de consola. En este capítulo, utilizaremos una base de datos simple en la que tenemos una tabla de Clientes simple como se muestra en la siguiente imagen.

Instalar Fluent NHibernate

El primer paso para iniciar Fluent NHibernate es instalar el paquete Fluent NHibernate. Así que abre elNuGet Package Manager Console e ingrese el siguiente comando.

PM> install-package FluentNHibernate

Una vez que se haya instalado correctamente, verá el siguiente mensaje.

Agreguemos una clase de modelo simple de Cliente y el siguiente programa muestra la implementación de la clase de 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; } 
   } 
}

Ahora necesitamos crear Mappings usando NHibernate fluido, así que agregue una clase más CustomerMapen su proyecto. Aquí está la implementación de la clase 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"); 
      } 
   }
}

Agreguemos otra clase NHibernateHelper en el que estableceremos diferentes ajustes de configuración.

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(); 
      } 
   }
}

Ahora pasemos al Program.cs archivo en el que iniciaremos una sesión y luego crearemos un nuevo cliente y guardaremos ese cliente en la base de datos como se muestra a continuación.

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(); 
         } 
      } 
   } 
}

Ejecutemos su aplicación y verá el siguiente resultado.

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 puede ver, se crea el nuevo cliente. Para ver el registro del cliente, vayamos a la base de datos y veamos Ver datos y verá que se agrega 1 Cliente.