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

Responder a