Gustavo, me interesa lo de uNHAddins. El ejemplo de sessionManagent esta disponible? Necesito entrar a prolijar esto cuanto antes. Si veo que lo puedo aplicar ahora ok, y de lo contrario lo voy viendo para otro proyecto.
Raul. Gustavo Ringel escribió: > Bueno, ingresar rapido o no depende un poco de que tenes hasta ahora. No > siempre es facil cambiar de estrategia si el orden no se adapta a la > logica de lo que tenes hecho. En el caso de conversation si lo que > inyectas en los repositorios es el sessionfactory es muy facil (es la > mejor manera de trabajar con multiples bases de datos de manera ordenada > esta) > > La gran sesion es un gran peligro. El acceso a las lineas lo hubieras > obtenido si hubieras usado fetch join en el caso de HQL o eager load en > criteria o directamente lazy=false si para todos los casos de uso > necesitas el elemento. Empezar a hacer roundtrips a la base con lazy es > peligroso, la idea es que si en un caso de uso lo necesitas usas una > estrategia de fetch eager y si no lo necesitas no haces nada... > > Por ahi la magia de NH... > > En el ejemplo que tengo de sessionManagement en uNHAddins estoy usando > los objetos de dominio en el form, y mantengo una conversacion a la que > paso los objetos de un lado a otro hasta que se termina. En mi caso en > produccion en general trabajo con DTO's que implementan las estrategias > de binding de Winforms o WPF o lo que este usando y por tanto no uso > todas las maravillas de NH durante el trabajo en el Form...esto tiene > pros y contras. > > Mi estrategia de DTO fue tomada cuando no tenia forma de trabajar con > conversacion, ahora estoy evaluando todavia si usare eso o no...todavia > soy mas tendiente a eso, porquen o me gusta que mis objetos de dominio > tengan que implementar cosas de Binding...pero en algunos proyectos > puede ser util... > > Gustavo. > > 009/1/12 Raul Lopez <[email protected] <mailto:[email protected]>> > > > Gustavo, actualmente abro la sesion en el constructor del presenter > y la paso como argumento cuando accedo al repositorio. > De esa forma tengo una "gran sesion". En principio tenía una sesion > por acceso al repositorio, pero el problema era que al traer un > objeto factura p.ej, al cerrar la sesion a la vuelta del repositorio > perdia el acceso a las lineas por el tema del lazy. > De todos modos esta estrategia me esta dando problemas, como el de > los commits que mencionas. > Me interesa lo uNHAddins. Es algo que se pueda incorporar en una > forma relativamente rápida? > > Saludos, > Raul. > > Gustavo Ringel escribió: > > Raul, a la primer excepcion que te de la sesion tenes que tirar > el form > > con esa estrategia. > > Si haces algo en un background worker no puede usar la sesion que > > iniciaste en el constructor. > > Si haces algo en un timer no podes usar la sesion que iniciaste en el > > constructor. > > Idem para threads. > > > > Es decir, no vas a estar contento rapidamente. > > > > Una solucion relativamente "rapida" es usar un presenter y que el > > presenter sea el encargado de hacer opensession en cada funcion > llama a > > los servicios/repositorios encargados de realizar un caso de uso > y commitea. > > > > Obviamente el problema que tenes aca es que pasa si lo que queres es > > abrir una orden agregar algunas lineas, etc, todo en la misma > > conversacion de manera que todo lo que hiciste se commitee o solo > una parte. > > > > Es decir, en lo que dije antes si abris la orden commitea, luego > creas > > algunass lineas se commitean, luego tenes algun problema...y ups, no > > podes abortar, tenes que borrar a mano. > > En el patron de conversacion de uNHAddins con una estrategia > razonable > > para el id (no identity obviamente sino cualquier otra :)) podes > volver > > atras toda la conversacion... > > > > Saludos. > > > > Gustavo. > > > > 2009/1/12 Raul Lopez <[email protected] > <mailto:[email protected]> <mailto:[email protected] > <mailto:[email protected]>>> > > > > > > Carlos, estoy usando algo asi donde _session es global y aplico > > NHibernateSessionFactory.OpenSession() en el constructor. > > En principio funciona, ahora voy a ver que pasa cuando > traslade este > > tema de parent-child a la aplicacion real. > > Si se me complica aviso :) > > > > Saludos, > > Raul. > > > > > > Carlos Peix escribió: > > > Hola Raul, > > > > > > Normalmente no uso winforms pero por ahí este patron podria > > funcionarte: > > > > > > using ( ITransaction tx = _session.BeginTransaction() ) > > > { > > > // Aquí haces todas tus actualizaciones > > > > > > tx.Commit(); > > > } > > > > > > Donde _seesion es la variable de instancia del form, ahí > tenes la > > sesion > > > abierta y tenes un scope bien limitado para la transaccion. > > > > > > En cuanto a esto: > > >> - Estas agregando LA MISMA INSTANCIA de chuild a todos los > > parents, me > > >> parece que eso no es lo que queres hacer. > > > a los efectos de la prueba me parecio que no era > relevante, pero... > > > > > > [Carlos] Creo que es muy relevante porque en el Child > tenes una > > referencia > > > al parent, lo cual invalida que un child pueda pertenecer a > > varios parents. > > > Incluso diria que este es el motico por el cual te quedaba un > > child asociado > > > a un solo parent (el ultimo), supondiendo que estuvieras > haciendo la > > > referencia al parent, cosa que no se ve en tu codigo. > > > > > > > > > Suerte > > > > > > Carlos Peix > > > > > > -----Mensaje original----- > > > De: [email protected] > <mailto:[email protected]> > > <mailto:[email protected] > <mailto:[email protected]>> > > > [mailto:[email protected] > <mailto:[email protected]> > > <mailto:[email protected] > <mailto:[email protected]>>] En nombre de Raul Lopez > > > Enviado el: Lunes, 12 de Enero de 2009 11:44 a.m. > > > Para: [email protected] > <mailto:[email protected]> > > <mailto:[email protected] > <mailto:[email protected]>> > > > Asunto: [NHibernate-Hispano] Re: ayuda con coleccion > > > > > > > > > Hola Carlos, en efecto habia varias cosas mal (lo copie > > correctamente al > > > mail). Probe con tu codigo y funciona. > > > Te comento conclusiones entre lineas: > > > > > > Carlos Peix escribió: > > >> Hola Raul, > > >> > > >> Hay varias cosas en tu ejemplo que no estan bien, no se > si porque lo > > >> copiaste incorrectamente al mail o porque estan > definitivamente mal. > > >> Te pido que reescribas tu codigo de esta manera (y que > cambies > > lo que > > >> corresponda siempre y cuando entiendas los motivos). > Estos son los > > >> puntos que no me cierran > > >> > > >> - No queda claro el scope de la variable _session. > > > es global para todo el form > > > > > >> - Estas agregando LA MISMA INSTANCIA de chuild a todos los > > parents, me > > >> parece que eso no es lo que queres hacer. > > > a los efectos de la prueba me parecio que no era > relevante, pero... > > > > > >> - Veo una propiedad Parent en el child que no estas > seteando en el > > >> codigo que enviaste. > > > fue omision, no lo vi > > > > > >> - Estas haciendo un update con cada parent, esto no seria > necesaro, > > >> incluso no es necesario hacer ninguno con la opcion de > cascade > > que tenes. > > > de acuerdo, esta de mas > > > > > >> // Aca achicas mucho mas el scope de session, el metodo // > > >> CreateSession() depende de cómo manejes e sessionFactory > // pero > > >> deberia ser una sesion nueva puesto que estas haciendo // > el Dispose > > >> al salir del using(), esa sesion no servira para // nada mas. > > > > > > aca no hay problema, pero en el programa real se me > complica si > > no hago la > > > sesion global (tengo lio con el lazy) Voy a estudiar mas > sobre el > > tema del > > > manejo de las sesiones. > > > > > > Muchas gracias una vez mas. > > > > > > Saludos, > > > Raul. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --~--~---------~--~----~------------~-------~--~----~ Para escribir al Grupo, hágalo a esta dirección: [email protected] Para más, visite: http://groups.google.com/group/NHibernate-Hispano -~----------~----~----~----~------~----~------~--~---
