2009-12-29 10 views
7

Ho un oggetto Area che ha molti figli sottozona:NHibernate salvare/ascoltatori di eventi di aggiornamento: l'ascolto per i bambini oggetto di risparmiare

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

che i bambini sono mappate come un rapporto unidirezionale non inversa:

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

L'area è la mia radice aggregata. Quando salvi un'area (ad esempio Session.Save (area)), l'area viene salvata e il figlio SubAreas viene automaticamente messo in cascata.

Desidero aggiungere un listener di eventi di salvataggio o aggiornamento da catturare ogni volta che le aree secondarie e/o sono persistenti. Ad esempio, ho un'area, che ha 5 SubAreas. Se mi collego in SaveEventListeners:

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

Quando ho salvare l'area, myListener viene sparato solo una volta solo per le aree limitrofe (sottozone vengono ignorati). Voglio che il 5 SubAreas venga catturato anche nell'ascoltatore dell'evento. Se mi collego in SaveOrUpdateEventListeners invece:

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

Quando ho salvare l'area, myListener è non licenziato a tutti. Stranamente, se collego in SaveEventListeners e SaveOrUpdateEventListeners:

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

Quando ho salvare l'area, myListener è sparato 11 volte: una volta per la zona, e due volte per ogni sottozona! (Penso che NHIbernate stia INSERISCI la SubArea e poi AGGIORNA con la chiave esterna dell'area).

Qualcuno sa cosa sto facendo male qui, e come posso far sì che l'ascoltatore spari una volta per ogni area e sottoarea?

+0

hai lavorato a questo? avendo lo stesso problema – andy

+0

Anch'io! Qualcuno ha trovato una soluzione? – nozzleman

risposta

0

Non 100% correlato alla domanda, ma se si esegue la mappatura con inverse = "true" sulla raccolta non si ottengono le istruzioni di aggiornamento E INS.

+0

Vero, ma penso che ciò richiederebbe la relazione unidirezionale nel modello a oggetti (il SubArea avrebbe un riferimento anche ad Area) ma in questo caso non lo voglio o ne ho bisogno. –

+0

Certamente sarebbe il modo più semplice per risolvere il problema. @JamesAllen - Perché non vuoi un molti-a-uno da SubArea a Area? –

0

Problemi di NH INSERIRE la dichiarazione per conoscere l'ID dell'oggetto se non può essere conosciuto (IDENTITÀ o SEQUENZA ad esempio).

Quindi, se si desidera annullare che è necessario utilizzare un generatore di id che non richiede roundtript al DB (come guid o guid.combo).