2010-03-05 10 views
6

Lo scenario è il seguente,NHibernate non cascata eliminare i bambini

Ho 3 oggetti (ho semplificato i nomi) di nome Parent , figlio di genitori del bambino & del bambino
figlio di genitore è un insieme di genitore, e il figlio di un bambino è un insieme di bambini.

mappatura è la seguente (parti interessate)

genitore

<set name="parentset" 
    table="pc-table" 
    lazy="false" 
    fetch="subselect" 
    cascade="all-delete-orphan" 
    inverse="true"> 
    <key column=FK_ID_PC" on-delete="cascade"/> 
    <one-to-many class="parentchild,parentchild-ns"/> 
</set> 

bambino con i genitori

<set name="childset" 
    table="cc-table" 
    lazy="false" 
    fetch="subselect" 
    cascade="all-delete-orphan" 
    inverse="true"> 
    <key column="FK_ID_CC" on-delete="cascade"/> 
    <one-to-many class="childschild,childschild-ns"/> 
</set> 

Quello che voglio ottenere è che quando elimino il genitore, ci sarebbe un cascata elimina completamente attraverso il figlio del bambino. Ma ciò che accade attualmente è questo.

(questo è puramente a scopo di test mappatura) ottenere una controllante (funziona bene)

IQuery query = session.CreateQuery("from Parent where ID =" + ID); 
IParent doc = query.UniqueResult<Parent>(); 

ora la parte di eliminazione

session.Delete(doc); 
transaction.Commit(); 

Dopo aver risolto il 'non può inserire il valore null' errore con cascading e inverse spero che questo ora cancelli tutto con questo codice, ma solo il genitore viene eliminato.

Mi sono perso qualcosa nella mia mappatura che è probabile che manchi? Qualsiasi suggerimento nella giusta direzione è più che benvenuto!


Diego, grazie per la risposta al punto. (e spiegazione)

Sono andato con la rimozione del on-delete="cascade", questo perché mi piace il maggior controllo possibile nel codice e non nel database.

Il codice indicato di seguito è il risultato (funzionante).

genitore bambino

<set name="parentset"  
    table="pc-table"  
    cascade="all-delete-orphan"  
    inverse="true" 
    batch-size="5">  
    <key column=FK_ID_PC"/>  
    <one-to-many class="parentchild,parentchild-ns"/>  
</set> 

genitori

<set name="childset"    
    table="cc-table"  
    cascade="all-delete-orphan" 
    batch-size="5" 
    inverse="true">    
    <key column="FK_ID_CC">    
    <one-to-many class="childschild,childschild-ns"/>    
</set> 

Spero che questo aiuti le persone con lo stesso problema!

risposta

6

Impostando on-delete="cascade" sulle chiavi, si sta lasciando che il DB gestisca la cascata.

Stai generando il tuo schema con NHibernate?

Ho appena riprodotto il tuo esempio e ha funzionato bene con e senza quell'attributo. Durante la rimozione, NHibernate esegue la cascata.

BTW, utilizzando lazy="false" fetch="subselect" non è qualcosa che si dovrebbe fare per impostazione predefinita. Se rimuovi tali attributi, lascia on-delete="cascade" e modifica cascade in save-update, avrai solo due query per recuperare ed eliminare un genitore.