Hola Grupo,

Llevo varias semanas leyendo vuestros debates y aprendiendo cada vez
más con vosotros.
Ahora mismo estoy trabajando en un FrameWork con la versión 1.2 de
NHibernate. Este framework fue encargado a una empresa externa. Llevo
ya muchos meses intentando darle soporte y aprendiendo NHibernate ya
que hasta hace poco solo trabajaba en C# ASP .NET

Tengo bastantes dudillas que os iré planteando poco a poco.

La primera de ellas es un problema con un alisa en un mapeo de una
clase.
Estoy intentando crear un mecanismo de multiidioma para ello utilizo
una variable de sesión que se encarga de guardar el id del idioma en
el que quiero que se obtengan ciertas propiedades y me he creado un
propiedad con una formula y un filtro que es el id del idioma. Os pego
el hbm:

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

  <class name="domain.ZonaDN, domain"
        table="Zonas"
        lazy="true"
        schema="dbo"
        >

    <!--Heredados de GenericFWKObj-->
    <id name="Id" column="ID" unsaved-value="0">
      <generator class="native" />
    </id>

    <!--Heredados de GenericDomainObj-->

    <property name="BorradoLogico" column="BorradoLogico"/>

    <!--Heredados de GenericDomainObj-->
    <property name="ObservacionesBD" column="ObservacionesBD" />
    <property name="FechaAltaBD" column="FechaAltaBD" type="DateTime"/
>
    <property name="FechaModificacionBD" column="FechaModificacionBD"
type="DateTime"/>
    <property name="UsuarioAltaBD" column="UsuarioAltaBD"/>
    <property name="UsuarioModificacionBD"
column="UsuarioModificacionBD"/>

    <!--Heredados de BasicaDN-->
    <!--<property name="Nombre" column="Nombre"/>-->
    <property name="Nombre"  formula=" ISNULL((SELECT
Traducciones.Traduccion
      FROM dbo.Traducciones
      INNER JOIN dbo.Entities
              ON Entities.Id = Traducciones.EntidadId
                      AND Entities.Name = 'ZonaDN'
                      AND Traducciones.IdiomaID = :Localization.LocalizationId
      INNER JOIN dbo.Campos
              ON Campos.Id = Traducciones.CampoId
              AND Campos.Nombre = 'Nombre'
      WHERE zonadn0_.ID = Traducciones.ReferenciaId),
zonadn0_.Nombre)"/>



    <property name="Descripcion" column="Descripcion"/>


    <!--Propiedades específicas de la entidad-->
    <property name="Tipo" column="Tipo"/>

    <!--Relaciones con otras entidades-->
    <many-to-one name="Marca" column="MarcaID" class="domain.MarcaDN,
domain"/>
    <many-to-one name="Delegado" column="EmpleadoID" class="
domain.EmpleadoDN, domain"/>
    <many-to-one name="Area" column="AreaID" class="domain.AreaDN,
domain"/>

  </class>

  <filter-def name="Localization">
    <filter-param name="LocalizationId" type='System.Int32'/>
  </filter-def>


</hibernate-mapping>




El problema viene con el alias zonadn0 en algunas ocasiones NH me
lanza la select con ese alias y en otras ocasiones con “this_”  Os
dejo la select completa:

SELECT this_.ID as ID121_1_, this_.BorradoLogico as BorradoL2_121_1_,
this_.ObservacionesBD as Observac3_121_1_, this_.FechaAltaBD as
FechaAlt4_121_1_, this_.FechaModificacionBD as FechaMod5_121_1_,
this_.UsuarioAltaBD as UsuarioA6_121_1_, this_.UsuarioModificacionBD
as UsuarioM7_121_1_, this_.Tipo as Tipo121_1_, this_.MarcaID as
MarcaID121_1_, this_.EmpleadoID as EmpleadoID121_1_, this_.AreaID as
AreaID121_1_,  ISNULL((SELECT Traducciones.Traduccion
      FROM dbo.Traducciones
      INNER JOIN dbo.Entities
              ON Entities.Id = Traducciones.EntidadId
                      AND Entities.Name = 'ZonaDN'
                      AND Traducciones.IdiomaID = :Localization.LocalizationId
      INNER JOIN dbo.Campos
              ON Campos.Id = Traducciones.CampoId
              AND Campos.Nombre = 'Nombre'
      WHERE zonadn0_.ID = Traducciones.ReferenciaId),
zonadn0_.Nombre) as formula1_1_,  ISNULL((SELECT
Traducciones.Traduccion
      FROM dbo.Traducciones
      INNER JOIN dbo.Entities
              ON Entities.Id = Traducciones.EntidadId
                      AND Entities.Name = 'ZonaDN'
                      AND Traducciones.IdiomaID = :Localization.LocalizationId
      INNER JOIN dbo.Campos
              ON Campos.Id = Traducciones.CampoId
              AND Campos.Nombre = 'Descripcion'
      WHERE zonadn0_.ID = Traducciones.ReferenciaId),
zonadn0_.Descripcion) as formula2_1_, empleadodn2_.ID as ID6_0_,
empleadodn2_.BorradoLogico as BorradoL2_6_0_,
empleadodn2_.ObservacionesBD as Observac3_6_0_,
empleadodn2_.FechaAltaBD as FechaAlt4_6_0_,
empleadodn2_.FechaModificacionBD as FechaMod5_6_0_,
empleadodn2_.UsuarioAltaBD as UsuarioA6_6_0_,
empleadodn2_.UsuarioModificacionBD as UsuarioM7_6_0_,
empleadodn2_.Nombre as Nombre6_0_, empleadodn2_.Apellido1 as
Apellido9_6_0_, empleadodn2_.Apellido2 as Apellido10_6_0_,
empleadodn2_.NSS as NSS6_0_, empleadodn2_.Direccion as Direccion6_0_,
empleadodn2_.Urbanizacion as Urbaniz13_6_0_, empleadodn2_.Bloque as
Bloque6_0_, empleadodn2_.Numero as Numero6_0_, empleadodn2_.Escalera
as Escalera6_0_, empleadodn2_.Piso as Piso6_0_, empleadodn2_.Puerta as
Puerta6_0_, empleadodn2_.CodPostal as CodPostal6_0_,
empleadodn2_.Localidad as Localidad6_0_, empleadodn2_.Tlf as Tlf6_0_,
empleadodn2_.TlfMovil as TlfMovil6_0_, empleadodn2_.FechaNacimiento as
FechaNa23_6_0_, empleadodn2_.FechaAltaRegistro as FechaAl24_6_0_,
empleadodn2_.FechaInicio as FechaIn25_6_0_, empleadodn2_.Regimen as
Regimen6_0_, empleadodn2_.Email as Email6_0_,
empleadodn2_.CodigoVendedor as CodigoV28_6_0_,
empleadodn2_.Experiencia as Experie29_6_0_, empleadodn2_.FechaBaja as
FechaBaja6_0_, empleadodn2_.Aficiones as Aficiones6_0_,
empleadodn2_.Identificacion as Identif32_6_0_,
empleadodn2_.ProvinciaID as Provinc33_6_0_,
empleadodn2_.CuentaReservaID as CuentaR34_6_0_, empleadodn2_.PaisID as
PaisID6_0_, empleadodn2_.EstudiosID as EstudiosID6_0_,
empleadodn2_.MotivoBajaID as MotivoB37_6_0_,
empleadodn2_.IdentificacionTipoID as Identif38_6_0_,
empleadodn2_.ViaTipoId as ViaTipoId6_0_, empleadodn2_.SexoId as
SexoId6_0_, empleadodn2_.InstalacionId as Instala41_6_0_,
empleadodn2_.ConcesionarioId as Concesi42_6_0_, empleadodn2_.MarcaId
as MarcaId6_0_ FROM dbo.Zonas this_ left outer join dbo.Empleados
empleadodn2_ on this_.EmpleadoID=empleadodn2_.ID WHERE this_.Tipo = ?
and this_.MarcaID = ? and this_.BorradoLogico = ? ORDER BY
ISNULL((SELECT Traducciones.Traduccion
      FROM dbo.Traducciones
      INNER JOIN dbo.Entities
              ON Entities.Id = Traducciones.EntidadId
                      AND Entities.Name = 'ZonaDN'
                      AND Traducciones.IdiomaID = :Localization.LocalizationId
      INNER JOIN dbo.Campos
              ON Campos.Id = Traducciones.CampoId
              AND Campos.Nombre = 'Nombre'
      WHERE zonadn0_.ID = Traducciones.ReferenciaId),
zonadn0_.Nombre) asc


¿Existe alguna forma para que pueda controlar el nombre del alias que
genera NH?
Lo mismo estoy intentando matar moscas a cañonazos y hay otra forma
más sencilla de implementar el multiidioma. En un principio esta
parecía las flexible y rápida de implementar ya que originalmente la
que nos habían implementado no tenía nada para multiidioma y hay que
modificar muchas clases.


Por cierto el parámetro se inicializa en el session de la calse public
abstract class GenericNHibernateDao<T> : IGenericDao<T> where T :
IGenericFWKObj, new():
…

/// <summary>
        /// Expone la ISession usada (configurada según su sección de
configuración) en el DAO.
        /// </summary>
        protected ISession session
        {
            get
            {
                try
                {
                    //Multiidioma
                    Int32 sesionLocalizador = 1;

                    try
                    {

                        if (HttpContext.Current != null &&
                            HttpContext.Current.Session != null &&
 
HttpContext.Current.Session["sesionLocalizador"] != null)
                        {
                            //Se inicializa Variable multiidioma
                            sesionLocalizador =
(Int32)HttpContext.Current.Session["sesionLocalizador"];
                        }
                    }
                    catch
                    {
                        //El catch se produce porque no hay aun creado
HttpContext
                        sesionLocalizador = 1;
                    }

                    ISession s =
NHibernateMultiSessionManager.GetSessionFrom(_sessionFactoryElementName);
                    // UNDO: Cambiado porque hacía updates sin sentido
                    s.FlushMode = FlushMode.Commit;
                    //s.FlushMode = FlushMode.Never;

                    //Borro filtro sesion por si se cambia durante la
misma sesion
                    s.DisableFilter("Localization");
                    //Seteo con el nuevo valor de las session
 
s.EnableFilter("Localization").SetParameter("LocalizationId",
sesionLocalizador);

                    return s;
                }
                catch (Exception ex)
                {
                    throw new FWKDataException("AdoEx", ex);
                }
            }
        }

…


Espero que alguien tenga alguna idea para poder resolver esto ya que
realmente llevo tiempo dandole vueltas y no soy capaz de avanzar.

Muchas gracias a todos.

Saludos

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a