Buenos días,

Gracias por tus consejos. Reconozco que el modelo está basado en la base de 
datos. Es decir, primero pienso que información voy a guardar, luego diseño 
las tablas y finalmente hago los mappings.
La aplicación la empecé en enero de 2010 y lleva mas de dos años implantada 
y funcionando muy bien. Digo esto no para echarme flores (nada mas lejos de 
la realidad) sino para dejar patente que aunque se que hago un uso muy 
limitado de Nhibernate, considero que el trabajo que nos ahorra es gigante. 
Digo esto también para comentar que dada la situación no podría empezar 
desde cero con el modelo de datos (cosa que por otro lado me encantaría 
porque hace tiempo que se que tiene lagunas).
Otra cosa que me gustaría añadir es que he buscado en diferentes ocasiones 
algún profesor de Nhibernate que quiera darme unas clases para mejorar y 
aclarar conceptos pero nunca he encontrado a nadie en España que pueda 
desplazarse a Baleares (cobrando claro...). ¿sabéis de alguno?

Bueno, y dicho todo esto voy a intentar describir mejor el problema / 
situación:

La aplicación como es lógico tiene entidades separadas (con tabla asociada 
en base de datos):
-Clientes: Id, Nombre
-Proveedores: Id, Nombre
-Facturas: Id, CodigoCliente,.....
-NotasElementos: Id, CodigoElementoAsociado,Nota
-DocumentosElementos: Id, CodigoElementoAsociado, PathDocumento

Todos los Ids son del tipo GUID lo que me permite almacenarlos donde me 
interese.
Por esa razón el CodigoElementoAsociado de las tablas NotasElementos o 
DocumentosElementos pueden estar asociado a un Cliente, a un Proveedor o a 
lo que sea.
Generalmente no me interesa mirar "A quien pertenece este mensaje" o "a 
quien pertenece este documento". 
Mas bien lo que hago es: Dado este cliente muestrame sus documentos o sus 
notas lo cual lo hago a través del ID.
Hasta ahora lo hago de forma separada mediante una query y me va bien.
Las Views las uso para sacar listados en pantalla mediante Grids. El 
proyecto está desarrollado en WPF y si usara clases de entidades (o sea sin 
usar vistas) me vería obligado a usar Converters continuamente para mostrar 
la información tal y como deseo. por ejemplo para traducir un CodigoCliente 
en su Nombre correspondiente.
Entiendo que otro modo (una vez están todas las relaciones y mappings 
correspondientes) es ir saltando en propiedades y subpropiedades de cada 
DataItem para acceder desde la Entidad Factura a la Entidad Cliente y de 
ahí a su nombre, por ejemplo usando lazy=true. El problema que le veo a 
esto es que hay que mantener BindingPaths muy largos y que hay que 
recuperar entidades enteras cuando uno solo quiere el nombre.

Mi problema viene cuando alguien viene y me dice: Sácame todas las facturas 
de clientes que tengan documentos entre FechaA o FechaB o Sácame todas las 
Facturas cuyos clientes tengan una nota con el texto 'pepito'.

Y con eso llego a la pregunta del principio.

Necesito mapear una lista, set, bag o lo que sea en la vista 
ViewListadoFacturas. En esta Vista la clave primaria es el CodigoFactura 
pero yo quiero mapear una Lista (solo lectura) que me devuelva las notas 
del CodigoCliente que tiene asignado esa Factura.

Bueno, espero haberme explicado. Perdon por el post tan largo, espero que 
haya sido clarificador y podáis echarme una mano.

Un saludo y muchísimas gracias si has llegado hasta aquí.


El lunes, 8 de octubre de 2012 13:46:09 UTC+2, Carlos Peix escribió:
>
> Hola mouthbow,
>
> Algo que ayuda mucho en las consultas es que nos cuentes como es tu modelo 
> (ademas de los mappings). Parece ser que tu enfoque esta muy orientado a la 
> base de datos, por ejemplo con tu entidad ViewListadoFacturas.
>
> Es muy dificil entender (y mucho mas utilizar) un ORM si no dedicas un 
> poco de tiempo a pensar tu modelo. En general los ORMs funciona mucho mejor 
> y es mas facil usarlos, cuando tienes un modelo basados en objetos.
>
> Una de las opciones que tienes para resolver este problema es que todos 
> los elementos que relacionas a tu coleccion implementen alguna interfaz o 
> tengan una clase base, lo cual es razonable en un modelo de objetos, caso 
> contrario, como podria manejarlos tu objeto si no tienen nada en comun?
>
> Has pensado en eso?
>
> ----------------------------------
> Carlos Peix
>
> 2012/10/8 mouthbow <[email protected] <javascript:>>
>
>> Hola Marcos,
>>
>> Ante todo muchísimas gracias por tu respuesta.
>>
>> He revisado el código que me mandas y no termino de ver como sabe 
>> NHibernate la columna de origen con la que debe hacer el filtrado de la 
>> subcoleccion.
>> Es decir, según esto:
>>
>>  <set name="NotasElementosList">
>>       <key column="**CodigoElementoAsociado" />
>>       <one-to-many class="NotasElementos" />
>>     </set>
>>
>> Entiendo que ahí dice: defino una coleccion llamada NotasElementosList 
>> que se alimenta de la tabla NotasElementos, y debo filtrar en esa tabla por 
>> el campo CodigoElementoAsociado.
>> Sin embargo no dice en ningún sitio: Al filtrar por la columna 
>> CodigoElementoAsociado debes utilizar el valor de la columna CodigoCliente 
>> (y no el id definido que es lo que supongo que haría, no?)
>>
>>  <set name="NotasElementosList">
>>       <sourcekey column="**CodigoCliente" />
>>       <key column="**CodigoElementoAsociado" />
>>       <one-to-many class="NotasElementos" />
>>     </set>
>>
>> ¿Esto es posible?
>>
>> Gracias de nuevo!
>>
>> El sábado, 6 de octubre de 2012 01:05:08 UTC+2, Marcos Mellibovsky 
>> escribió:
>>
>>> Hola mouthbow:
>>>
>>> Me parece que asi te deberia andar:
>>>   <class name="ViewListadoFacturas">
>>>     <id type="Guid">
>>>       <generator class="guid" />
>>>     </id>
>>>     <property name="CodigoFactura" />
>>>     <property name="CodigoCliente" />
>>>     <set name="NotasElementosList">
>>>       <key column="**CodigoElementoAsociado" />
>>>       <one-to-many class="NotasElementos" />
>>>     </set>
>>>   </class>
>>>
>>>     public class ViewListadoFacturas
>>>     {
>>>         public virtual Guid CodigoFactura { get; set; }
>>>
>>>         public virtual Guid CodigoCliente { get; set; }
>>>
>>>         public virtual ISet<NotasElementos> NotasElementosList { get; 
>>> set; }
>>>     }
>>>
>>>
>>> El jueves, 4 de octubre de 2012 10:54:51 UTC-3, mouthbow escribió:
>>>>
>>>> Buenas tardes a tod@s!
>>>>
>>>> Tengo una pregunta que creo que lo mismo es básica pero no encuentro 
>>>> forma de hacer:
>>>>
>>>> Necesito definir un set en un archivo de mapping con unas necesidades 
>>>> especiales. He leído varias páginas pero no encuentro nada.
>>>> Supongamos que tengo un mapping de una Vista SQL
>>>>
>>>>
>>>> <class name="Namespace.**ViewListadoFacturas, Assembly" 
>>>> table="ViewListadoFacturas">
>>>>  
>>>> <id name="CodigoFactura" column="[CodigoFactura]" type="System.Guid">
>>>> <generator class="assigned"/>
>>>> </id>
>>>> <property name="CodigoCliente" column="[CodigoCliente]" 
>>>> access="field.pascalcase-**underscore" not-null="true" 
>>>> type="System.Guid"/>
>>>>
>>>> </class>
>>>>
>>>>
>>>> Y supongamos que luego un mapping de una clase como este: 
>>>>
>>>>
>>>> <class name="Namespace.**NotasElementos, MyAssembly" 
>>>> table="NotasElementos" >
>>>>
>>>> <id name="Id" column="CodigoNota" type="System.Guid"><generator 
>>>> class="guid"/></id>
>>>> <property name="CodigoElementoAsociado" column="**CodigoElementoAsociado" 
>>>> access="field.pascalcase-**underscore" not-null="false" 
>>>> type="System.Guid" insert="true" update="true"/>
>>>>
>>>> </class>
>>>>
>>>>
>>>> Donde CodigoCliente de la Vista y CodigoElemento asociado guardan los 
>>>> mismos valores y por tanto podríamos hacer un inner join entre ellos pero 
>>>> se llaman diferente.
>>>> El nombre es diferente porque en la clase NotasElementos también guardo 
>>>> Notas de Proveedores, Usuarios, etc... De ahí sale el concepto de 
>>>> CodigoElementoAsociado.
>>>>
>>>> Al usar Guids evito que dos elementos de clases diferentes compartan 
>>>> ids.
>>>>
>>>> La pregunta es:
>>>>
>>>> ¿Como puedo mapear las notas del cliente en la vista? Yo necesito hacer 
>>>> algo así:
>>>>
>>>>
>>>>
>>>> <set name="NotasElementosList" cascade="none" inverse="true" 
>>>> lazy="true" access="field.pascalcase-**underscore">
>>>> <Source key>
>>>> <column name="CodigoCliente" />
>>>> </Source key>
>>>> <Target key>
>>>> <column name="CodigoElementoAsociado"/**>
>>>> </Target key>
>>>> <one-to-many class="MyNamespace.**NotasElementos, GIOFACT_DAL"/>
>>>> </set>
>>>>
>>>>
>>>> ¿Es posible hacer esto? La verdad es que esto solucionaría una gran 
>>>> parte de las necesidades que tengo pendientes.
>>>>
>>>> Ni que decir que agradezco enormemente por adelantado cualquier ayuda 
>>>> que pueda recibir.
>>>>
>>>> Un saludo.
>>>>
>>>  -- 
>> Para escribir al Grupo, hágalo a esta dirección: 
>> [email protected] <javascript:>
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>
>

-- 
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