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
