Hola mouthbow,

Realmente no fue una buena decision haber centralizado (acoplado) las notas
de diferentes entidades en una sola tabla.  Las notas son simplemente notas
y pertenecen a cada entidad.  Es como tener una tabla de Nombres, o una
tabla de Descripciones.  Tal vez aplique en tu dominio, no se, pero es una
solucion que hay que pensarla dos veces.

Para tu caso, prueba en el <SET> utilizando un
WHERE<http://nhforge.org/doc/nh/en/index.html#collections-mapping>=
"codigo_elemento_asociado = 'codigo proveedor'" en cada una de las
entidades donde mapeas las notas.  Alli debes colocar un SQL arbitrario el
cual te va a servir para traerte solo un subconjunto de las Notas que
deseas basado en el codigo_elemento_asociado.  Espero te funcione.

Saludos,
Nestor Andres Rodriguez

2012/10/9 mouthbow <[email protected]>

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