9

Ho un progetto di implementazione di NHibernate e utilizzo di Caricamento lento. Ho due classi in questo progetto: Persona e Famiglia. La relazione tra questi due è l'aggregazione, significa che una persona ha una lista di persone. Maping è:Errore in Cascade: l'oggetto eliminato verrebbe ri-salvato mediante cascata

<class name="Person" table="Person_Person" > 

    <id name="Id" type="Int64" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 

    <bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" > 
     <key column="Person_id_fk"/> 
     <one-to-many class="Domain.Entities.Family,Domain.Entities"/> 
    </bag> 

    </class> 

In questo progetto, ho avere una persona per ID quindi rimuovere una famiglia di famiglie persona.

Person person = SessionInstance.Get<Person>(id); 
foreach (Family fam in person.Families) 
    if (fam.Name == "Jaun") 
     SessionInstance.Delete(fam); 

La famiglia non eliminato, causa un'eccezione da questo messaggio: deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]

come posso eliminare una famiglia di persona?

risposta

13

Fondamentalmente ciò che NHibernate si lamenta è che si sta dicendo esplicitamente di cancellare un record per la famiglia, quindi quando si ri-salva la persona la famiglia verrà rimessa a posto, perché la persona ha ancora un riferimento ad esso nella sua lista di Famiglie.

Invece, NHibernate ti sta dicendo di gestire questa relazione nel modo orientato agli oggetti che NHibernate ti consente di utilizzare. Basta rimuovere il riferimento alla famiglia "Jaun" dall'elenco Person.Families, quindi mantenere la Persona. Quando lo fai, NHibernate rimuoverà la relazione tra quella Famiglia e quella Persona. Se la famiglia non è più referenziata da nient'altro, dal momento che hai impostato la proprietà Cascade su "all-delete-orphan", il record della famiglia "Jaun" verrà completamente cancellato dal DB.

+2

'person.Families.Remove (fam); SessionInstance.Save (persona); ' –

+0

@Cole W: esattamente. – KeithS