Ok muchas gracias por tu respuesta.

Seguiré investigando.

Un saludo.

El martes, 9 de octubre de 2012 11:45:49 UTC+2, Carlos Peix escribió:
>
> Hola mouthbow,
>
> Yo no conozco manera de realizar ese mapeo (lo cual no significa que no 
> exista).
>
> Yo he resuelto ese tipo de situaciones con una clase base para los items 
> de la coleccion que tenga una referencia al documento (backreference).
>
> ----------------------------------
> Carlos Peix
>
> 2012/10/9 mouthbow <[email protected] <javascript:>>
>
>> Hola Carlos,
>>
>> Gracias por tu respuesta.
>> Lamentablemente la opción del dataset no es válida para mí. Como comento 
>> en otra entrada de este mismo post, la aplicación ya existe y utilizo este 
>> modelo en múltiples pantallas. 
>> Creo que podría ser que no me hubiera explicado correctamente. Considero 
>> que no necesito polimorfismo, ni clase base (aunque si que la tengo) ni 
>> nada de todo eso.
>> Olvidemos por un momento el tema de la vista, creo que la pregunta se 
>> puede responder sin esta condición.
>>
>> EntidadCliente: Id (CodigoCliente), Nombre
>> EntidadProveedor: Id (CodigoProveedor), Nombre
>> EntidadEmpresa: Id (CodigoEmpresa), Nombre
>> EntidadFactura: Id (CodigoFactura), CodigoCliente, CodigoProveedor, 
>> CodigoEmpresa
>> EntidadNotasElementos: Id (CodigoNota), CodigoElementoAsociado, Nota
>>
>> Quiero un mapping dentro del mapping de EntidadFactura que haga esto:
>>
>> <set name="NotasClienteList" cascade="none" inverse="true" lazy="false" 
>> access="field.pascalcase-underscore">
>>  <key>
>> <column name="CodigoElementoAsociado"  *SOURCECOLUMNNAME="CodigoCliente"*  
>> />
>>  </key>
>> <one-to-many class="Entity.NotasElementos, GIOFACT_DAL"/>
>> </set>
>>
>> <set name="NotasProveedorList" cascade="none" inverse="true" lazy="false" 
>> access="field.pascalcase-underscore">
>> <key>
>>  <column name="CodigoElementoAsociado"  *
>> SOURCECOLUMNNAME="CodigoProveedor"*  />
>> </key>
>>  <one-to-many class="Entity.NotasElementos, GIOFACT_DAL"/>
>> </set>
>>
>> <set name="NotasEmpresaList" cascade="none" inverse="true" lazy="false" 
>> access="field.pascalcase-underscore">
>>  <key>
>> <column name="CodigoElementoAsociado"  *
>> SOURCECOLUMNNAME="CodigoProveedor"*  />
>>  </key>
>> <one-to-many class="Entity.NotasElementos, GIOFACT_DAL"/>
>> </set>
>>
>>
>> Por favor, esto es posible, sí o no? Y si es que sí, como?
>>
>> Muchísimas gracias de nuevo.
>>
>> El martes, 9 de octubre de 2012 04:00:47 UTC+2, Carlos Peix escribió:
>>>
>>> Hola mouthbow,
>>>
>>> Creo que estas enfrentando dos problemas distintos y una sola solucion 
>>> no bastara.
>>>
>>> Sugiero que programes una vista o stored procedure que devuelva la 
>>> informacion que necesitas y no la mapees a ninguna entidad de NHibernate, 
>>> simplemente utiliza un dataset. Creo que puede hacerse con NH un query que 
>>> recibas en un objeto cualquiera, aunque no estoy familiarizado con esta 
>>> tecnica.
>>>
>>> Hasta aqui sin preocuparte del mundo de objetos.
>>>
>>> Luego, debes resolver el problema de estas relaciones en el mundo de los 
>>> objetos y, una vez que lo tengas resuelto en ese mundo, ver como lo mapeas 
>>> con la base de datos. Veras que es mucho mas simple. Para eso yo he usado 
>>> polimorfismo implcicito o explicito. Hay ejemplos en la documentacion de NH.
>>>
>>> Un saludo
>>>
>>> ------------------------------**----
>>> Carlos Peix
>>>
>>> 2012/10/8 mouthbow <[email protected]>
>>>
>>> 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]>
>>>>>
>>>>>> 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.**ViewListadoFac****turas, Assembly" 
>>>>>>>> table="ViewListadoFacturas">
>>>>>>>>  
>>>>>>>> <id name="CodigoFactura" column="[CodigoFactura]" 
>>>>>>>> type="System.Guid">
>>>>>>>> <generator class="assigned"/>
>>>>>>>> </id>
>>>>>>>> <property name="CodigoCliente" column="[CodigoCliente]" 
>>>>>>>> access="field.pascalcase-**under****score" 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-**under****score" 
>>>>>>>> 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-**under****score">
>>>>>>>> <Source key>
>>>>>>>> <column name="CodigoCliente" />
>>>>>>>> </Source key>
>>>>>>>> <Target key>
>>>>>>>> <column name="CodigoElementoAsociado"/******>
>>>>>>>>  </Target key>
>>>>>>>> <one-to-many class="MyNamespace.**NotasElemen****tos, 
>>>>>>>> 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: NHibernat...@**
>>>>>> googlegroups.com
>>>>>>
>>>>>> Para más, visite: http://groups.google.com/**group**
>>>>>> /NHibernate-Hispano<http://groups.google.com/group/NHibernate-Hispano>
>>>>>>
>>>>>
>>>>>  -- 
>>>> Para escribir al Grupo, hágalo a esta dirección: NHibernat...@**
>>>> googlegroups.com
>>>> Para más, visite: 
>>>> http://groups.google.com/**group/NHibernate-Hispano<http://groups.google.com/group/NHibernate-Hispano>
>>>>
>>>
>>>  -- 
>> 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