En lo particular agradecería una lectura a ese ejemplo que mencionas... ayudaría bastante...
Y pues si, nh es genial, por eso lo uso, aunque sigo con dudas y creo que las seguiré teniendo, pero no importa es lo que entretiene y divierte =) Saludos. -- Roberto Ramírez 2010/2/16 José F. Romaniello <[email protected]> > Es por que nhibernate es una maaaaasa, cuando vos haces: > si.Guardar(movimiento) > > no te esta insertando nada, solamente esta encolando eso para cuando se > haga flush (end del request) > > cuando vos haces: session.Save(factura) tampoco guarda nada nhibernate. > > > Recien cuando termina el request, en un batch, hace todos los inserts y en > el orden que mas le conviene, no esta bueno? > > > Hay otras mil opciones, vos podrías tener una relación similar, solo que > con un solo save . Entonces podes decir que te haga save en cascada de los > objetos transitorios que no han sido persistidos todavía... en fin hay mil > opciones. > > Si tengo tiempo me voy a escribir el mismo ejemplo de visitors con domain > events en castellano. > > > El 16 de febrero de 2010 17:12, Roberto Ramírez > <[email protected]>escribió: > >> Funcionó tal y como mencionas... el problema es que no asignaba la misma >> referencia de mi detalle en el movimiento, sino que en el movimiento >> asignaba una nueva instancia. >> >> var factura = new Factura(); >> factura.AgregarDetalle(new Detalle()); >> >> foreach (var visitor in _visitors) { >> //Lógica que me indica si se moverá algo en el inventario. >> if (visitor.Aplica(factura)) { >> //Realizo el movimiento. >> visitor.Aplicar(factura); >> } >> } >> >> En el método Aplicar tenia: >> >> public void Aplicar(Factura entidad) { >> MovimientoServices si = new MovimientoServices(); >> IList<Detalle> detalles = List<Detalle>(); >> foreach(Detalle linea in entidad.Detalle) { >> Detalle detalle = new Detalle() { Id = linea.Id } >> detalles.Add(detalle); >> var movimiento = new Movimiento(){ Detalle = detalles } >> } >> si.Guardar(movimiento) >> } >> >> session.Save(factura) >> >> Para corregirlo solamente agregue misma referencia a Detalle en mi >> Movimiento tal como comenta José: >> >> public void Aplicar(Factura entidad) { >> MovimientoServices si = new MovimientoServices(); >> var movimiento = new Movimiento(){ Detalle = entidad.Detalle } >> } >> si.Guardar(movimiento) >> } >> >> El error fue mío... nhibernate funciona correctamente; el tema de Visitor >> y DomainEvents esta fuera del alcance, y aunque DomainEvents me parece muy >> interesante, una vez corregida mi burrada, Visitor funciona de maravilla, >> aunque debo de admitir que un acercamiento a DomainEvents con este ejemplo >> explicado por alguno de ustedes me vendría de maravilla (off-topic por >> supuesto) =D >> >> Dentro del output de SQL no veo nada raro, al menos que me ustedes me >> indiquen lo contrario. El orden de inserción fue de la siguiente manera: >> >> 1. Insert tabla de Factura. >> 2. Insert(s) tabla de Detalle (por cada línea o artículo). >> 3. Insert(s) tabla de Movimiento (por cada registro en Detalle). >> >> Para mi lo interesante es conocer como nh le hace para insertar el >> idDetalle en la tabla de Movimiento >> >> Saludos. >> >> -- >> Roberto Ramírez >> >> >> 2010/2/16 José F. Romaniello <[email protected]> >> >>> Como dijo Gustavo, ahora voy mas por el camino de domainevents. La idea >>> es parecida, pero me ahorro tener que especificar que tengo que inyectar. >>> >>> Uso algo muy parecido a lo que esta en el blog de Udi Dahan, pero con >>> ServiceLocator. >>> >>> Ahora bien, cambiar de visitors a domain events creo que no te va a >>> resolver el problema. Vos dijiste: >>> >>> En mi modelo, el detalle de la factura no conoce los movimientos en el >>> inventario, >>>> pero el movimiento si conoce a que detalle de factura pertenece. >>> >>> ¿Como identificar la referencia del detalle para insertarla en >>>> el movimiento si todo se ejecuta en un solo request (Session-Per-Request) y >>>> aun no conozco la referencia del detalle que se guardo en la base de datos? >>> >>> >>> >>> Y que importa que no se haya guardado en la base de datos todavía, nh no >>> es tan burro. Pseudo código: >>> >>> var factura = new Factura() >>> factura.AgregarLinea(new LineaFactura()) >>> //domain event o lo que sea de por medio... pasando referencia a la >>> factura >>> var movimiento = new Movimiento(){ Detalle = factura....Detalle[0] } >>> session.Save(movimiento) >>> >>> session.Save(factura) >>> >>> >>> En tu caso algo como esto debería funcionar, el truco tal vez esta en >>> usar bien los cascades.. y ese tipo de cosas. Tal vez el save de movimiento >>> debería desencadenar el save de línea, que a su vez desencadena el save de >>> factura. >>> >>> Creo que sobre este pseudocódigo podemos discutir, quiero decir saquemos >>> de la discusión Visitors y DomainEvents. Lo dejo abierto. >>> >>> >>> si vos podes, escribí un test de comportamiento así, abris una sessión y >>> ejecutas ese pseudocódigo que te pase. Y decinos que pasa, que sqls ves en >>> el output etc. >>> >>> El 15 de febrero de 2010 16:40, Gustavo Ringel <[email protected] >>> > escribió: >>> >>> Si entendiste la idea de los visitors DomainEvents es una forma de hacer >>>> lo mismo pero en forma menos explicita, fijate en el comentario de Fabio al >>>> post de Jose, y acordate que por mas lindo que sea el martillo nuevo se usa >>>> un destornillador para un tornillo. >>>> >>>> Gustavo. >>>> >>>> 2010/2/15 Roberto Ramírez <[email protected]> >>>> >>>> Muchas gracias d00t >>>>> >>>>> Entonces a lo que veo es que me toca buscar sobre Domain Events para >>>>> resolver mi problema, dejando fuera a NH de esto... y pues Visitor ya >>>>> lo había entendido, pero al parecer no me servirá.. >>>>> >>>>> Saludos... =) >>>>> >>>>> On 15 feb, 11:15, Gustavo Ringel <[email protected]> wrote: >>>>> > No, mas bien algo como esto: >>>>> > >>>>> > http://www.udidahan.com/2009/06/14/domain-events-salvation/ >>>>> > >>>>> > <http://www.udidahan.com/2009/06/14/domain-events-salvation/>Listeners >>>>> de NH >>>>> > para algo que no es especifico de datos como la creacion de un >>>>> movimiento >>>>> > quiere decir que a una regla de negocios la estas todavia atendiendo >>>>> a nivel >>>>> > de datos. >>>>> > >>>>> > A mi gusto Listeners de NH se pueden usar para auditoria, tracing, o >>>>> cosas >>>>> > que son especificas de la capa de datos y que el dia que tiras la >>>>> capa de >>>>> > datos no tienen mas utilidad para tu negocio. >>>>> > >>>>> > Con Domain Events la idea es en el momento en que pasa algo avisar >>>>> que paso >>>>> > por ejemplo DomainEvents.FacturaGuardada(new FacturaGuardadaEvent() { >>>>> > Factura = factura, Detalles = detallesList }) >>>>> > >>>>> > Vos tenes en algun lado un SalvarMovimientosHandler : >>>>> > Handles<FacturaGuardadaEvent> y al atender el evento guarda un >>>>> movimiento en >>>>> > la base por cada detalle. >>>>> > >>>>> > Gustavo. >>>>> > >>>>> > 2010/2/15 Roberto Ramírez <[email protected]> >>>>> > >>>>> > >>>>> > >>>>> > > Muchas gracias por la respuesta Gustavo, me queda claro lo que >>>>> > > comentas. >>>>> > >>>>> > > Una cuestión pequeñita... ¿un evento de dominio == listeners de nh? >>>>> > >>>>> > > On 15 feb, 10:51, Gustavo Ringel <[email protected]> wrote: >>>>> > > > No entiendo exactamente donde entra NH en la consullta. >>>>> > > > Es decir, el codigo que yo pienso para resolver eso al menos es >>>>> > > > independiente de la capa de persistencia, tambien los visitors >>>>> de Jose >>>>> > > son >>>>> > > > independientes de la capa de persistencia. >>>>> > >>>>> > > > Creo que NH no es un factor para la decision de negocio. Podrias >>>>> > > > transformarlo en un factor si quisieras usar Listeners o alguna >>>>> cosa >>>>> > > > especifica de NH para guardar el movimiento. >>>>> > >>>>> > > > En mi caso el servicio que guarda la factura y los detalles llama >>>>> al >>>>> > > > Dao/Repositorio que sabe guardar una factura y sus detalles y se >>>>> genera >>>>> > > un >>>>> > > > evento de dominio para cada detalle de factura. >>>>> > >>>>> > > > Otro componente recibe esos eventos y se encarga de guardar los >>>>> > > movimientos. >>>>> > >>>>> > > > Los visitors de Jose hacen algo parecido a eso, pero creo que >>>>> tambien >>>>> > > Jose >>>>> > > > para esos casos favorece domain events hoy en dia :) >>>>> > >>>>> > > > Gustavo. >>>>> > >>>>> > > > 2010/2/15 Roberto Ramírez <[email protected]> >>>>> > >>>>> > > > > Buenos días a todos. >>>>> > >>>>> > > > > ¿Puedo resolver con nhibernate esto o es un error en mi modelo? >>>>> > >>>>> > > > > Yo guardo una factura con su respectivo detalle, dentro de mi >>>>> modelo >>>>> > > > > yo necesito generar un movimiento en inventario y por cada >>>>> movimiento >>>>> > > > > guardar la referencia del detalle de la factura así: >>>>> > >>>>> > > > > Factura ==> Detalle ==> Movimiento >>>>> > >>>>> > > > > El proceso del movimiento al inventario es un paso intermedio >>>>> al >>>>> > > > > momento de guardar-actualizar mi factura. >>>>> > >>>>> > > > > En mi modelo, el detalle de la factura no conoce los >>>>> movimientos en el >>>>> > > > > inventario, pero el movimiento si conoce a que detalle de >>>>> factura >>>>> > > > > pertenece. >>>>> > >>>>> > > > > ¿Como identificar la referencia del detalle para insertarla en >>>>> el >>>>> > > > > movimiento si todo se ejecuta en un solo request >>>>> (Session-Per-Request) >>>>> > > > > y aun no conozco la referencia del detalle que se guardo en la >>>>> base de >>>>> > > > > datos? >>>>> > >>>>> > > > > Uso Visitor como patron de diseño tomado del post de J. >>>>> Rommaniello >>>>> > > > > >>>>> http://jfromaniello.blogspot.com/2009/11/caso-practico-patron-visitor. >>>>> > > .. >>>>> > > > > , >>>>> > > > > el proceso del movimiento lo realizo en un Visitor. >>>>> > >>>>> > > > > Muchas gracias por su ayuda. >>>>> > >>>>> > > > > -- >>>>> > > > > 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 >>>>> >>>>> -- >>>>> 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 >>>> >>> >>> -- >>> 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 >> > > -- > 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
