Lucas | 25 Jun 16:28
Picon

Duda y mareo sobre Mapeo NHIbernate


Explico mi problema del cual he leido sobre el famoso bug de
NHibernate + Sql server

Comienzo.
Aplicacion web asp.net

Archivos de Mapeo: Todas como recurso incrustado (embbed resource)
Clientes.hbm.xml
Usuarios.hbm.xml
Proyectos.hbm.xml
Tareas.hbm.xml

Clases:
Usuarios.cs
UsuarioService.cs
Tareas.cs
TareasService.cs
Proyectos.cs
ProyectosService.cs

Sucede lo siguiente.

La clase UsuarioService.cs es la encargada de añadir usuarios a una
tabla con la siguiente funcion.

Tambien la clase tiene una relacion de uno a muchos con la tabla
Tareas.

Funcion de agregado de usuario:
        public static void AnadirUsuario(Usuarios usuario)
        {
            using (NHibernate.ISession NHSession =
SessionFactory.GetNewSession())
            {
                using (NHibernate.ITransaction ts =
NHSession.BeginTransaction())
                {
                    NHSession.Save(usuario);
                    ts.Commit();
                }
            }

La clase USUARIOS.CS

public class Usuarios
    {
        private long id;
        private string nombre;
        private string rol;
        private string clave;
        private IList<Tareas> tareas;

        public Usuarios()
        {
            tareas = new List<Tareas>();
        }

        public virtual IList<Tareas> TareasList
        {
            get { return tareas; }
            set { tareas = value; }
        }

        public virtual long IdUsuario
        {
             get { return id; }
             set { id = value; }
        }

        public virtual string Nombre
        {
             get { return nombre; }
             set { nombre = value; }
        }

        public virtual string Clave
        {
             get { return clave; }
             set { clave = value; }
        }

        public virtual string Rol
        {
             get { return rol; }
             set { rol = value; }
        }
    }

Mapeo Usuarios.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="PAModelo" namespace="PAModelo">

  <class name="Usuarios" table="Usuarios">
    <id name="IdUsuario" type="long" unsaved-value="0">
      <generator class="identity"/>
    </id>
    <property name="Clave" type="String" not-null="true"/>
    <property name="Nombre" type="String" not-null="true"/>
    <property name="Rol" type="String" not-null="true" />

    <bag name="TareasList" cascade="all-delete-orphan">
      <key column="IdUsuario" />
      <one-to-many class="Tareas" />
    </bag>
  </class>
</hibernate-mapping>

Aclaro que el generator class es IDENTITY y funciona sin problemas.

La cuestion es la siguiente, tengo otra tabla que Agrega Clientes y
tiene la misma relacion que tiene Usuario con Tareas pero Clientes la
tiene con otra tabla que se llama Proyectos.

Aqui la clase cliente.

public class Clientes
    {
        private long id;
        private string nombre;
        private string descripcion;
        private IList<Proyectos> proyectos;

        public Clientes()
        {
            proyectos = new List<Proyectos>();
        }

        public virtual IList<Proyectos> ProyectosList
        {
            get { return proyectos; }
            set { proyectos = value; }
        }

        public virtual long IdCliente
        {
             get { return id; }
             set { id = value; }
        }

        public virtual string Descripcion
        {
             get { return descripcion; }
             set { descripcion = value; }
        }

        public virtual string NombreCliente
        {
            get { return nombre; }
            set { nombre = value; }
        }
    }

Aqui su Archivo de Mapeo.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="PAModelo" namespace="PAModelo">
  <class name="Clientes" table="Clientes">
    <id name="IdCliente" type="long" unsaved-value="0">
      <generator class="identity"/>
    </id>
    <property name="Descripcion" type="String" not-null="true"/>
    <property name="NombreCliente" type="String" not-null="true"/>

    <bag name="ProyectosList" cascade="all-delete-orphan">
      <key column="IdCliente" />
      <one-to-many class="Proyectos" />
    </bag>

  </class>
</hibernate-mapping>

y Aqui viene lo gracioso, ocurre el problema de Identity_scope() al
momento de agregar usuarios.

        public static void AñadirCliente(Clientes cliente)
        {
            using (NHibernate.ISession NHSession =
SessionFactory.GetNewSession())
            {
                using (NHibernate.ITransaction ts =
NHSession.BeginTransaction())
                {
                    NHSession.Save(cliente);
                    ts.Commit();
                }
            }
        }

Ahora bien, porque Funciona perfectamente con la clase usuario y
usuarioservice pero con Cliente y ClienteService no funciona?

Otro dato mas, a la hora de realizar esta funcion para usuarios:

                NHibernate.ICriteria qry = NHSession.CreateCriteria
(typeof(Usuarios));
                usuarios = qry.List<Usuarios>();

Funciona perfecto.

pero con la de cliente

                NHibernate.ICriteria qry = NHSession.CreateCriteria
(typeof(Clientes));
                clientes = qry.List<Clientes>();

No funciona?

Adjunto tambien los archivos de mapeos de Proyectos y Tareas.

Proyecto.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="PAModelo" namespace="PAModelo">
  <class name="Proyectos" table="Proyectos">
    <id name="IdProyecto" type="long" unsaved-value="0">
      <generator class="identity"/>
    </id>

    <property name="Descripcion" type="String" not-null="true"/>

    <many-to-one name="Clientes" column="IdCliente" cascade="all"/>

    <bag name="TareasList" cascade="all-delete-orphan">
      <key column="IdProyecto"/>
      <one-to-many class="Tareas"/>
    </bag>

  </class>
</hibernate-mapping>

Tareas.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="PAModelo" namespace="PAModelo">
  <class name="Tareas" table="Tareas">
    <id name="IdTareas" type="long" unsaved-value="0">
      <generator class="native"/>
    </id>
    <property name="TipoTarea" type="String" not-null="true"/>
    <property name="Actividades" type="String" not-null="true"/>

    <many-to-one name="Usuarios" column="IdUsuario" cascade="all"/>

    <many-to-one name="Proyectos" column="IdProyecto" cascade="all"/>
  </class>
</hibernate-mapping>

Muchisimas gracias por responder, este tema me esta volviendo loco!

--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección: NHibernate-Hispano <at> googlegroups.com
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---


Gmane