Home Assistant Fácil

Curso de Home Assistant y domótica

  • Blog
  • Soy un pardillo
  • Podcast
  • Curso Arduino
  • Curso Domótica
  • Acceder
Usted está aquí: Inicio / Tutoriales / Fragmentos / C# / Configurar NHibernate para C#

Configurar NHibernate para C#

Luis del Valle Hernández

En este fragmento vamos a ve como podemos configurar NHibernate para nuestro proyecto con C#. Resulta interesante trabajar con un ORM (Object-Relational Mapping) cuando trabajamos con una base de datos. Uno de los ORM más famosos es el Hibernate y su homólogo para .NET NHibernate. Lo primero que deberíamos hacer es descargarlo del gestor de paquetes Nuget desde nuestro Visual Studio Community 2013 e instalarlo. Además de NHibernate es más que aconsejable instalar Fluent NHibernate que nos permite olvidarnos de los archivos XML para el mapeo de las entidades.

  • nhibernate-fluentnhibernate-nuget

Una vez instalados estos dos paquetes vamos a pasar a programar. Para ello debemos crearnos lo primero una entidad que la llamaremos PedidoEntity. Hará la función de un pedido de un comercio normal y corriente. De momento solo vamos a tener tres propiedades el Id, el Nombre y la Fecha.

using System;
using System.Collections.Generic;

namespace NHibernateApp.Entities
{
    public class PedidoEntity
    {
        public virtual int Id { get; protected set; }
        public virtual string Nombre { get; set; }
        public virtual DateTime Fecha { get; set; }

        public PedidoEntity()
        {
        }
    }
}

Ahora nos falta el archivo que va a mapear esta entidad en nuestro modelo, lo vamos a llamar PedidoMap. En el definiremos todo lo relacionado con la base de datos. Si no tenemos Fluent NHibernate este paso se hace a través de XML, un trabajo muy tedioso y no recomendado.

using FluentNHibernate.Mapping;
using NHibernateApp.Entities;

namespace NHibernateApp.Mappings
{
    public class PedidoMap : ClassMap<PedidoEntity>
    {
        public PedidoMap()
        {
            //Nombre de la tabla en la base de datos
            Table("PEDIDO");
            //Identificador único, KEY, le asignamos una secuencia para que se genere
            //de manera automática
            Id(x => x.Id).GeneratedBy.Sequence("SQ_PEDIDO");
            //Mapeamos el nombre dando el nombre que queremos a la columna en la
            //base de datos
            Map(x => x.Nombre).Column("NOMBRE");
            //Mapeamos la fecha y asignamos un valor por defecto que dependerá 
            //del motor de base de datos
            Map(x => x.Fecha).Column("FECHA").Default("SYSDATE");
        }
    }
}

Por último tenemos que crear nuestro gestor de sesiones SessionManager. En esta clase configuramos todo lo relativo a nuestra base de datos. Se trata de un Singleton.

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

namespace NHibernateApp.Persistence
{
    public class SessionManager
    {
        #region ATRIBUTOS
        private ISessionFactory _sessionFactory;
        private ISession _session;
        #endregion

        #region PROPIEDADES
        /// <summary>
        /// Propiedad sesión de NHibernate
        /// </summary>
        public ISession Session
        {
            get
            {
                if (null == this._session || !this._session.IsOpen)
                    this._session = this.OpenSession();

                return _session;

            }
            set { this._session = value; }
        }
        #endregion

        #region CONSTRUCTOR SINGLETON
        private static volatile SessionManager instance;
        private static object syncRoot = new Object();
        private SessionManager()
        {
        }

        public static SessionManager Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (syncRoot)
                    {
                        if (instance == null)
                            instance = new SessionManager();
                    }
                }

                return instance;
            }
        }
        #endregion

        #region METODOS CONFIGURACIÓN
        /// <summary>
        /// Método que abre la sesión
        /// </summary>
        /// <returns>La sesión activa</returns>
        private ISession OpenSession()
        {
            //Open and return the nhibernate session
            return this.SessionFactory.OpenSession();
        }

        /// <summary>
        /// Método que nos sirve para testear si tenemos conexión con la base de datos
        /// </summary>
        /// <returns>True si hay conexión y false en caso contrario</returns>
        public bool TestConnection()
        {
            ISessionFactory _iSession = this.SessionFactory;

            if (null == _iSession)
            {
                return false;
            }

            return true;
        }

        /// <summary>
        /// Método que crea la session factory
        /// </summary>
        public ISessionFactory SessionFactory
        {
            get
            {
                try
                {
                    //Siempre que no la hayamos creado antes
                    if (_sessionFactory == null)
                    {
                        //Comenzamos la configuración a través de FluentNHibernate
                        var f = Fluently.Configure();


                        //Configuramos la cadena de conexión a la base de datos en este caso utilizamos ORACLE XE 11
                        string connString = "Data Source=XE;User Id=USUARIO;Password=PASS;Min Pool Size=10;Connection Lifetime=240";
                        f.Database(OracleClientConfiguration.Oracle10.ConnectionString(connString).ShowSql());

                        //Mapeo de clases, con solo hacer una referencia a una clase nos mapeara todas las clases
                        f.Mappings(m =>
                            m.FluentMappings.AddFromAssemblyOf<PedidoEntity>());

                        //Con esta configuración cualquier modificación en nuestro modelo se aplicará automaticamente en 
                        f.ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(true, true));
                        //Esta linea de código la descomentaremos y comentaremos la anterios si queremos resetear toda nuestra base de datos
                        //f.ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true,true));

                        //Por último creamos el session factory
                        _sessionFactory = f.BuildSessionFactory();
                    }
                    return _sessionFactory;
                }
                catch (Exception e)
                {
                    return null;
                }
            }
        }

        #endregion
    }
}

Con esto damos por terminado este fragmento. Recuerda que para cualquier duda te puedes poner en contacto con nosotros a través del formulario de contacto o dejarnos un comentario en este artículo.

NUKI SMART LOCK

Nuki Smart Lock Go, Pro o Ultra: cuál comprar y la prueba que lo decide todo

Mira chapapote, imagina la cara de tonto que se te queda cuando te gastas casi 350 pavos en una cerradura inteligente Nuki, llega a casa, la abres con … [+ info...]

slzb-06

SLZB-06U: migrar coordinador Zigbee desde Sonoff Dongle P (y por qué el Dongle E es diferente)

Vale, lo confieso: no hay nada que me dé más pereza en domótica que tener que migrar toda la red Zigbee. El típico momento en el que tu viejo … [+ info...]

Home Assistant 2026.6

Home Assistant 2026.6: dashboard inteligente, IR bidireccional y automatizaciones más claras

Llevas meses peleándote con el dashboard de Home Assistant: añadir una tarjeta requería saber de memoria el nombre de cada tipo de bloque, y al final … [+ info...]

Copyright © 2026 · Programar Fácil · Aviso legal