jueves, 24 de octubre de 2013

Como implementar la relación one to one con NHibernate

Seguimos a la carga con NHibernate y .NET. Podéis encontrar más apuntes sobre NHibernate aquí. Ahora toca como implementar una relación del tipo one to one para, en mi caso, mapear la tabla de empleados con la de contraseñas. A mi particularmente me gusta separar estas tablas, para no tener tablas muy grandes y para separar los datos del usuario de los datos de acceso. Este sistema permite mayor flexibilidad para poder facilitar el acceso a nuestra aplicación a otro tipo de entidades como por ejemplo a clientes o proveedores. Estos  que tenemos dados de alta en otra tabla y se puedan loguear teniendo que hacer no muchas modificaciones. El esquema que vamos a implementar es el siguiente:

Como hemos dicho, si por ejemplo tenemos otra tabla con los clientes y queremos darles acceso a nuestra aplicación solamente tendremos que añadirle una columna con el usuario_id en la tabla clientes y la relación con la tabla usuario.
Partimos de que tenemos las tablas creadas y las relaciones correctamente implementadas apra centrarnos en los ficheros que necesitamos para crear estas clases en .NET. Si nos interesa, podemos hacer que NHibernate nos cree las tablas por nosotros como mostramos en esta entrada. El fichero Empleado.cs será tal y como mostramos a continuación:
public class Empleado : Entity
    {      
        public virtual string Nombre { get; set; }
        public virtual string Apellidos { get; set; }
        public virtual string Extension { get; set; }
        public virtual string Telefono { get; set; }
        public virtual string Email { get; set; }
        public virtual Usuario Usuario_id { get; set; }
    }
Y el fichero Usuario.cs será así:
    public class Usuario : Entity
    {
        public virtual string Loggin { get; set; }
        public virtual string Password { get; set; }
    }
Podemos ver que en la clase Empleado tiene un atributo que es un usuario donde almacenaremos el Id del objeto Usuario. Además podemos ver que ambas clases extiendes de otra llamada Entity. En la clase Entity es donde defino el Id, la versión y otras características necesarias. Esto lo hago siguiendo las recomendaciones de este libro NHibernate 3.0 Cookbook. Los ficheros hbm.xml que nos mapeará los objetos con la base de datos y donde implementaremos las relacciones serán los siguientes. Primero el Empleado.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="OtraPrueba"
    namespace="OtraPrueba">
  <class name="Empleado">
    <id name="Id">
      <generator class="guid.comb" />
    </id>
    <version name="Version" />
    <property name="Nombre" not-null="true" />
    <property name="Apellidos" not-null="true" />
    <property name="Extension" not-null="true" />
    <property name="Telefono" not-null="true" />
    <property name="Email" not-null="true" />
    <many-to-one name="Usuario_id"        unique="true"     column="Usuario_id"/>
   
  </class>
</hibernate-mapping>
Y ahora el fichero Usuario.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="OtraPrueba"
    namespace="OtraPrueba">
  <class name="Usuario">
    <id name="Id">
      <generator class="guid.comb" />
    </id>
    <version name="Version" />
    <property name="Loggin" not-null="true" />
    <property name="Password" not-null="true" />

<one-to-one name="Empleado"        class="Empleado"/>

  </class>
</hibernate-mapping>
Podemos ver en el fichero Empleado.hbm.xml como se implementa la relación one to one y donde le indicamos la clase Usuario y el nombre de la columna, en nuestro clase Usuario_id. Ya podemos entonces hacer los siguiente:
Usuario usuario = new Usuario();
usuario.Loggin = txtLogin.Text.ToString();
usuario.Password = txtPassword.Text.ToString();


Empleado empleado = new Empleado();
empleado.Nombre = txtNombre.Text.ToString();
empleado.Apellidos = txtApellidos.Text.ToString();
empleado.Extension = txtExtension.Text.ToString();
empleado.Email= txtEmailText.ToString();
empleado.Telefono = txtTelefono.Text.ToString();
empleado.Usuario_id = usuario;


var nhConfig = new Configuration().Configure();
var sessionFactory = nhConfig.BuildSessionFactory();

var session = sessionFactory.OpenSession();
var tx = session.BeginTransaction();


session.Save(usuario);
session.Save(empleado);

tx.Commit();
Iré posteando como implementar el resto de relaciones a medida que tenga que ir empleándolas.
Espero que os sirva y si es así, compartir y difundir! No os de miedo usar los comentarios si tenéis algún problema o comentario que hacer

No hay comentarios :

Publicar un comentario