Trackear cambios en colleccion con IPreCollectionUpdateEventListener

7 views
Skip to first unread message

Jose Ramirez

unread,
Dec 17, 2009, 12:00:41 PM12/17/09
to NHibernat...@googlegroups.com
Hola

Estoy tratando de trackear los cambios que se hacen sobre los valores de una coleccion en una entidad.
El modelo es  mas o menos asi.

public class Equipment
{
        public ISet<EquipmentProperty> Properties {get; set;}
        //...
}

public class EquipmentProperty
{
        public Equipment Equipment {get; set;}
        public object Value {get; set;}
        //...
}

Especificamente quiero guardar en una tabla lo siguiente:

Equipo, Propiedad, Valor Anterior, Valor Actual, Fecha

Intente hacerlo con IPreUpdateEventListener que esta re bueno porque tiene State y OldState pero resulta que como Properties es una coleccion el listener PreUpdate no se activa al hacer cambios en la coleccion.
Hasta que llegue al IPreCollectionUpdateEventListener que efectivamente se ejecuta antes de guardar la coleccion.
Ahora, no encuentro una forma de saber el "viejo" valor de la propiedad Value de cada elemento de la coleccion.
Vi que  en OnPreUpdateCollection(PreCollectionUpdateEvent e) el evento tiene informacion de la coleccion en un IPersistentCollection y que ese persistentCollection tiene metodos GetSnapshot, etc pero todos me piden un ICollectionPersister como parametro.
Ahi es donde no se que mas hacer.

Alguien me puede tirar una mano con esto?

Saludos


Jose Ramirez

Fabio Maulo

unread,
Dec 17, 2009, 12:18:15 PM12/17/09
to nhibernat...@googlegroups.com
los elemento de la collection entran en IPreUpdateEventListener si necesitan un update.

--
Para escribir al Grupo, hágalo a esta dirección: NHibernat...@googlegroups.com
Para más, visite: http://groups.google.com/group/NHibernate-Hispano



--
Fabio Maulo

Jose Ramirez

unread,
Dec 17, 2009, 1:31:33 PM12/17/09
to nhibernat...@googlegroups.com
2009/12/17 Fabio Maulo <fabio...@gmail.com>

los elemento de la collection entran en IPreUpdateEventListener si necesitan un update.

Mm, eso no esta pasando en este caso. El tipo de la clase de la coleccion no es una entidad, esta mapeada como composite dentro de un Set, quizas sea por eso.
Cuando actualizo elementos, a la DB van deletes e inserts, pero tampoco se enganchan los IPreInsert, IPreDelete Listeners.
El unico que se ejecuta es el IPreCollectionUpdate.

Pero si hubiera una forma de averiguar la info que necesito desde el PreCollectionUpdate para mi es susficiente.

Jose Ramirez


Fabio Maulo

unread,
Dec 17, 2009, 1:34:54 PM12/17/09
to nhibernat...@googlegroups.com
Se que no es facil pero adentro de IPersistentCollection tenes lo que buscas


Jose Ramirez


--
Para escribir al Grupo, hágalo a esta dirección: NHibernat...@googlegroups.com
Para más, visite: http://groups.google.com/group/NHibernate-Hispano



--
Fabio Maulo

Juan

unread,
Dec 18, 2009, 4:29:45 PM12/18/09
to NHibernate-Hispano
Chepe, te remito a un post que tiene un ejemplo que te puede venir
bien

http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx

Juan

unread,
Dec 18, 2009, 4:33:37 PM12/18/09
to NHibernate-Hispano
Aqui va otro que puede que te ayude...

http://darrell.mozingo.net/2009/08/31/auditing-with-nhibernate-listeners/

On Dec 17, 12:00 pm, Jose Ramirez <jos...@gmail.com> wrote:

Jose Ramirez

unread,
Dec 29, 2009, 1:58:43 PM12/29/09
to nhibernat...@googlegroups.com
Gracias por los links,
El de Ayende ya lo habia leido pero el otro no.

Te cuento que termine usando el IPreCollectionUpdateEventListener y como no pude obtener el snapshot de la entidad termine levantando en otra session la misma entidad y haciendo una consulta linq to objects para obtener las propiedades que se modificaron.
No quedo "elegante" pero esta andando.

saludos

Jose

2009/12/18 Juan <juan.g...@gmail.com>
Reply all
Reply to author
Forward
0 new messages