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.
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
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.