Hola de nuevo,
He probado lo que comentas pero sigo teniendo un ultimo problema.
A la hora de definir la clausula where no se como referenciar a la Clase
Padre, la vista por ejemplo:
<id name="CodigoCabeceraFactura" column="[CodigoCabeceraFactura]"
type="System.Guid"><generator class="assigned"/></id>
<property name="CodigoCentro" column="[CodigoCentro]"
access="field.pascalcase-underscore" not-null="true" type="System.Guid"/>
<property name="CodigoEpisodio" column="[CodigoEpisodio]"
access="field.pascalcase-underscore" not-null="true" type="System.Int32"/>
<property name="CodigoFactura" column="[CodigoFactura]"
access="field.pascalcase-underscore" not-null="false" type="System.String"/>
<property name="CodigoGuidEpisodio" column="[CodigoGuidEpisodio]"
access="field.pascalcase-underscore" not-null="true" type="System.Guid"/>
<property name="ContadorCabecerasEpisodio"
column="[ContadorCabecerasEpisodio]" access="field.pascalcase-underscore"
not-null="true" type="System.Byte"/>
<property name="FechaFactura" column="[FechaFactura]"
access="field.pascalcase-underscore" not-null="false"
type="System.DateTime"/>
<set name="NotasEpisodioList" table="MensajesItems"
where="CodigoElementoAsociado = CodigoGuidEpisodio">
<key column="CodigoElementoAsociado"/>
<one-to-many class="GIOFACT_DAL.Entity.MensajesItems, GIOFACT_DAL"/>
</set>
Esta es la linea:
where="CodigoElementoAsociado = CodigoGuidEpisodio">
Lo he probado tal y como está y así:
where="thisCodigoElementoAsociado = this.CodigoGuidEpisodio">
Pero no me resuelve la propiedad CodigoGuidEpisodio y salta excepción.
Se te ocurre como hacerlo?
Gracias de nuevo. ;-)
El miércoles, 10 de octubre de 2012 16:17:37 UTC+2, mouthbow escribió:
>
> 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]>
>>
>>> 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