2009-12-29 8 views
7

que tienen un objeto zona que tiene muchos niños subzona:NHibernate guardar/detectores de eventos de actualización: escucha de objeto secundario ahorra

public class Area 
{ 
    ... 
    public virtual IList<SubArea> SubAreas { get; set; } 
} 

que los niños se asignan como una relación unidireccional no inversa:

public class AreaMapping : ClassMap<Area> 
{ 
    public AreaMapping() 
    { 
     HasMany(x => x. SubAreas).Not.Inverse().Cascade.AllDeleteOrphan(); 
    } 
} 

El área es mi raíz agregada. Cuando guardo un área (por ejemplo, Session.Save (area)), el área se guarda y las SubAreas secundarias se conectan en cascada automáticamente.

Quiero agregar un detector de eventos de guardado o actualización para capturar siempre que mis áreas y/o se hayan conservado. Digamos, por ejemplo, que tengo un área que tiene 5 SubAreas. Si engancho en SaveEventListeners:

Configuration.EventListeners.SaveEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener }; 

Cuando guardo la zona, myListener solamente se dispara una vez sólo para el área (subáreas se ignoran). Quiero que las 5 SubAreas también sean atrapadas en el oyente del evento. Si engancho en SaveOrUpdateEventListeners lugar:

Configuration.EventListeners.SaveOrUpdateEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener }; 

Cuando guardo la zona, myListener es no dispararon en absoluto. Curiosamente, si engancho en SaveEventListeners y SaveOrUpdateEventListeners:

Configuration.EventListeners.SaveEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener }; 
Configuration.EventListeners.SaveOrUpdateEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener }; 

Cuando guardo la zona, myListener se dispara 11 veces: una vez para la zona, y dos veces para cada subárea! (Creo que porque NHIbernate está INSERTANDO la Subárea y luego ACTUALIZANDO con la clave externa de área).

¿Alguien sabe lo que estoy haciendo mal aquí, y cómo puedo hacer que el oyente dispare una vez para cada área y subárea?

+0

¿Has trabajado en esto? teniendo el mismo problema – andy

+0

Yo también! ¿Ha encontrado alguien una solución? – nozzleman

Respuesta

0

No es 100% relacionada con su pregunta, pero si asigna con inverse = "true" en su colección que no consigue al menos el inserto Y instrucciones de actualización.

+0

Es cierto, pero creo que esto requeriría que la relación fuera unidireccional en el modelo de objetos (la Subárea también tendría una referencia al Área), pero en este caso no la quiero ni necesito. –

+0

Sin duda sería la forma más fácil de resolver el problema. @JamesAllen - ¿Por qué no quieres un multiarea de Subárea en Área? –

0

NH emite instrucción INSERT con el fin de conocer el Id del objeto si no puede conocerlo (IDENTIDAD o SECUENCIA, por ejemplo).

Por lo tanto, si desea anular la necesidad de utilizar un generador de ID que no requiera el envío de ida y vuelta a la base de datos (como guid o guid.combo).

Cuestiones relacionadas