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
