9

Tengo un proyecto de implementación de NHibernate y uso de Lazy Loading. Tengo dos clases en este proyecto: Persona y familia. La relación entre Esos dos es la agregación, significa que una Persona tiene una lista de Persona. Maping es:Error en Cascade: el objeto eliminado se volvería a guardar en cascada

<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> 

En este proyecto, yo consigo a una persona por ID luego retire una familia de familias persona.

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

La familia no se elimina, porque lanzar una excepción por este mensaje: deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]

¿Cómo puedo eliminar una familia de persona?

Respuesta

13

Básicamente, lo que NHibernate se queja es que le está diciendo explícitamente que elimine un registro para la Familia, y luego cuando vuelva a guardar la Persona, la Familia volverá a estar en su lugar, porque la Persona todavía tiene una referencia a ella en su lista de Familias.

En su lugar, NHibernate le dice que debe tratar esta relación de manera orientada a objetos que NHibernate le permite usar. Simplemente elimine la referencia a la familia "Jaun" de la lista Persona.Familias, luego persista con la Persona. Cuando hagas esto, NHibernate eliminará la relación entre esa Familia y esa Persona. Si ya no se hace referencia a la familia con otra cosa, dado que ha configurado la propiedad Cascade en "eliminar todo-huérfano", el registro de la familia "Jaun" se eliminará por completo de la base de datos.

+2

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

+0

@Cole W: Exactamente. – KeithS

Cuestiones relacionadas