Hola, El tema de juntarlo todo en una tabla fue un paso añadido. Inicialmente lo tenía todo por separado pero me parecía poco lógico teniendo en cuenta que eran los mismos campos. El ejemplo que pones de "Es como tener una tabla de Nombres o una table de Descripciones" no me termina de convencer dado entiendo que una entidad solo tiene un nombre o una descripción mientras que Notas puede tener muchísimas. Además que dichas notas no son simplemente notas sino que tienen muchas propiedades y funciones asociadas para filtrado por grupos de usuarios, fechas, etc...
En cualquier caso voy a lo importante: Muchas gracias por comentarme la opción de Where, aún no he podido probarlo pero desde luego que pinta bien. Cuando lo haya hecho lo comento por aquí. Un saludo. El martes, 9 de octubre de 2012 18:08:43 UTC+2, Andres Rodriguez escribió: > > 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] <javascript:>> > >> 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] <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
