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