25 Jun 16:28
Duda y mareo sobre Mapeo NHIbernate
Lucas <lukix4you <at> gmail.com>
2009-06-25 14:28:20 GMT
2009-06-25 14:28:20 GMT
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
-~----------~----~----~----~------~----~------~--~---
RSS Feed