2009-04-27 10 views
6

Mi sono imbattuto in un grosso problema per me con NHibernate. Ho 2 oggetti, ognuno con una collezione di cose. Ho bisogno di spostare una cosa dalla raccolta dall'oggetto A alla raccolta dell'oggetto B. Ricevo un errore su un oggetto eliminato perché, credo, NHibernate tenta di eliminare la cosa dall'insieme dell'oggetto A quando è necessario mantenerla per l'oggetto B. Da un punto di vista DB, si tratta semplicemente di aggiornare la proprietà "genitore" al nuovo oggetto (oggetto B). Ma con le collezioni, non sono davvero sicuro di cosa fare ...Collezioni NHibernate e oggetti in movimento

Esiste una procedura ben nota per spostare oggetti da una raccolta in un'altra in NHibernate?

Grazie in anticipo per qualsiasi aiuto.

saluti,

Eric.

+0

Come hai mappato le collezioni? –

risposta

3

sto supponendo che si sta utilizzando Cascade nella mappatura per la classe rappresentata da oggetti A e B, cioè A e B sono entrambe istanze di qualche classe X e la mappatura di X contiene un attributo cascade sulla raccolta che contiene l'oggetto da trasferire.

Data questa ipotesi, questo può essere d'aiuto.

Se si desidera trasferire l'oggetto da una raccolta all'altra, è necessario considerare se la cosa che viene spostata deve avere un'esistenza indipendente dalle due raccolte.

Se l'oggetto di trasferimento non viene salvato da solo, si verificheranno dei problemi durante il trasferimento poiché l'oggetto trasferito è già noto alla sessione.

Ci sono due vie che posso pensare. Il meglio dei due è probabilmente quello di trattare l'oggetto di trasferimento come un oggetto indipendente che viene salvato da solo sul db (cioè, non si affida a Cascading nella mappatura degli oggetti con la raccolta). Concettualmente, questo ha senso perché se è possibile trasferirlo da una raccolta all'altra implica che in qualche modo sia indipendente dai due oggetti che hanno le collezioni. Significa che potresti finire con gli orfani.

Se si desidera continuare a utilizzare Cascade nelle mappature, sarà necessario rimuovere dall'oggetto A in una transazione diversa dall'aggiunta all'oggetto B. Sospetto che non sia ciò che si desidera fare.

+0

Rob, grazie per la tua risposta. Abbiamo finito per far cadere NHibernate solo pochi giorni dopo e per qualche ragione, non ricordo di aver visto le notifiche delle mie risposte al mio thread. Grazie comunque per il tuo aiuto. –

0

Hai provato la mappatura utilizzando

cascade = "all-delete-orphan"