Chili
Te cuento como lo resolvi yo y así mato dos pajaros de un tiro ya que
había prometido subir si lo conseguía la solución a mi post "Ayuda con
un mapping" de unos días atras.
Mi solución va en el sentido que plantea Fabio, acerca de especializar
los comentarios, en mi caso especialize telefonos, mediante generics
de acuerdo a su titular, pero solo utilice una sola tabla y vistas.
Los pasos fueron
- una interface de ITituarTelefono al cual "adherian" todos las clases
que podían ser titulares de TE, en tu caso serían las clases que
pueden tener comentarios.
- Una clase telefonos<Titular>
- y en cada Clase de los Titulares(Domicilio, Persona, Empresa,
etc.) implementar la interface ITitularTelefono, y poner un
List<Telefonos<NombredelaClaseTitular>>
Esto por el lado del codigo del dominio, ahora los hbm...
- Arme (1)UN mapping de la clase telefono POR CADA Titular y en vez
de referenciar a la tabla de Telefonos, cada mapping referencia a una
vista de la DB que filtra por el tipo. En estos mapeos use any.
- Y en el hbm de cada Entidad Titular mapee la clase telefono
especializada que le corresponde
Al final les adjunto el codigo con las partes significativas del
asunto.
No es a mi entender la solución más limpia, (la primera que había
implementado lo era más pero no andaba) e incluso de alguna forma NH
se ha metido en mi modelo de dominio (al tener que especializar los
telefonos ) cosa que no me gusta, pero en principio esta anda.
Saludos, Claudio.
Telefono.cs
--------------------------------------------------------------------------------------------------------
public class Telefono
{
protected Telefono()
{
_ddi = 0;
_descripcion = String.Empty;
....
}
public Telefono(ITitularTelefono ITitular)
: this()
{
_titularTelefono = ITitular;
}
private ITitularTelefono _titularTelefono;
public ITitularTelefono Titular
{
get { return _titularTelefono; }
set { _titularTelefono = value;}
}
}
public class Telefono<T> : Telefono where T : ITitularTelefono
{
protected Telefono() : base() { }
public Telefono(T t) : base(t) { }
}
public interface ITitularTelefono
{
TipoTitularTelefono TipoTitular { get; }
int IdTitular { get; }
}
public enum TipoTitularTelefono
{
Persona,
Domicilio,
Empresa
}
}
Fin Telefono.cs
--------------------------------------------------------------------------------------------------------
Clase Titular del Telefono
----------------------------------------------------------------
public class Persona : ITitularTelefono
{
public Persona(string apellidos, string nombres)
{
_apellidos = apellidos;
_nombres = nombres;
_telefonos = new List<Telefono<Persona>>();
}
private IList<Telefono<AsistenteEvento>> _telefonos;
public IList<Telefono<AsistenteEvento>> Telefonos
{
get { return _telefonos; }
set { _telefonos = value; }
}
public TipoTitularTelefono TipoTitular
{
get { return TipoTitularTelefono.Persona; }
}
public int IdTitular
{
get { return _id; }
}
}
Fin Clase Titular del Telefono
----------------------------------------------------------------
Mapping de cada telefono especializado (en este caso Persona)
----------------------------------------
<class name="Domain.Telefono`1[Domain.Persona], Domain"
table="vwTelefonosPersona" lazy="false">
<id name="_id" column="IdTelefono" type="int" unsaved-value ="-1"
access="field">
<generator class="native"/>
</id>
<property name="_ddi" column="DDI" access="field" type="int"
not-null="true"/>
....
<property name="_descripcion" column="Descripcion" access="field"
type="string"
not-null="true"/>
<any name="_titularTelefono" access ="field" id-type="int" meta-
type ="String" >
<meta-value value="Persona" class="Domain.Persona, Domain"/>
<meta-value value="Domicilio" class="Domain.Domicilio, Domain"/>
<meta-value value="Empresa" class="Domain.Empresa, Domain"/>
<column name="TipoTitular"/>
<column name="IdTitular"/>
</any>
</class>
Fin Mapping de cada telefono especializado
----------------------------------------
Mapping de cada Clase Titular Telefono
-----------------------------------------------
<class name="Domain.Persona, Domain"
table="Personas" lazy="false">
<id name="_id" column="IdPersona" type="int" unsaved-value ="-1"
access="field">
<generator class="native"/>
</id>
<property name="_apellidos" column="Apellidos" access="field"
type="System.String"
not-null="true" length="200" />
<bag generic="true" name="_telefonos"
table="vwTelefonosPersona"
cascade="all" access="field" >
<key column="IdTitular" />
<one-to-many class
="MDS.AdminEventosCic.Domain.Telefono`1[Domain.Persona],Domain"/>
</bag>
Fin Mapping de cada Clase Titular Telefono
-----------------------------------------------
Código generico de cada vista de la db
-------------------------------------------------------------------------------
SELECT * FROM Telefonos WHERE TipoTitular="Persona"
--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección:
[email protected]
Para más, visite: http://groups-beta.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---