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

Responder a