5

Tengo una entidad 'Entrevista' que tiene un mapeo uno a uno con una entidad 'FormSubmission', la entidad Entrevista es el lado dominante por así decirlo, el mapeo es:Nhibernate - mapeo uno a uno con Cascade all-delete-huérfano, sin eliminar el huérfano

<class name="Interview"> 
    <id name="Id" column="Id" type="Int64"> 
     <generator class="identity" /> 
    </id> 

    // other props (snip).... 

    <one-to-one name="Submission" class="FormSubmission" 
     cascade="all-delete-orphan" /> 
</class> 

<class name="FormSubmission"> 
    <id name="Id" column="Id" type="Int64"> 
     <generator class="foreign"> 
      <param name="property">Interview</param> 
     </generator> 
    </id> 

    // other props (snip).... 

    <one-to-one name="Interview" class="Interview" 
     constrained="true" cascade="none" /> 
</class> 

Ambas entidades son parte de un agregado con la actuación Entrevista como la raíz agregada. Estoy intentando guardar/actualizar/eliminar el FormSubmission a través de la entidad Entrevista, por lo tanto, he mapeado el extremo de la entrevista de la asociación como cascade = "all-delete-huérfano". Por ejemplo, puedo crear un nuevo FormSubmission bien como esto:

myInterview.Submission = new FormSubmission(myInterview); 
InterviewRepository.Save(myInterview); 

... y esto funciona bien, el FormSubmission se guarda. Sin embargo, me parece que no puede borrar el FormSubmission la que estoy tratando de hacer como esto:

myInterview.Submission = null; 
InterviewRepository.Save(myInterview); 

... pero esto no parece eliminar el FormSubmission. He intentado asignar nula a ambos lados de la asociación:

myInterview.Submission.Interview = null; 
myInterview.Submission = null; 
InterviewRepository.Save(myInterview); 

Incluso he intentado establecer en cascada = "all-delete-orphan" en el lado FormSubmission, pero nada parece funcionar. ¿Qué me estoy perdiendo?

Respuesta

5

Probablemente esto no responda lo que quiere. La cascada "All-delete-huérfano" no es compatible con la asociación uno a uno de la clave principal según este problema: https://nhibernate.jira.com/browse/NH-1262. Incluso clave externa asociación uno-a-uno más probable es que ignora "todo-delete-orphan" en cascada:

<class name="Interview"> 
    <id name="Id" column="Id" type="Int64"> 
     <generator class="identity" /> 
    </id> 

    <property name="Name" /> 

    <many-to-one name="Submission" unique="true" cascade="all-delete-orphan" /> 
</class> 

<class name="FormSubmission"> 
    <id name="Id" column="Id" type="Int64"> 
     <generator class="identity" /> 
    </id> 

    <property name="Name" /> 

    <one-to-one name="Interview" cascade="all-delete-orphan" property-ref="Submission" /> 
</class> 

EDIT: jchapman suggests de usar interceptor (detector de eventos es más preferido en NH2.x y superior) a emular esta característica que suena interesante, pero aún no tengo una idea clara de cómo implementar tal interceptor/detector de eventos.

+0

Aww hombre, eso es una mierda! Me pregunto cuál es su justificación para no apoyarlo. A juzgar por el tono en la respuesta de Fabio Maulo: 'uno a uno con' eliminar todo-huérfano '?' Supongo que él piensa que este tipo de mapeo es una mala idea, pero me pregunto por qué? –

+0

Difícil de decir, es la pregunta directamente para Fabio :). De todos modos, parece que ya está implementado en Hibernate 3.5 (un año de antigüedad) según este número http://opensource.atlassian.com/projects/hibernate/browse/HHH-2608. No tengo idea de cómo se relacionan las versiones de Hibernate y NHibernate ... –

+1

El [problema NH-1262] (https://nhibernate.jira.com/browse/NH-1262) ahora se marca como resuelto en la próxima versión 4.1. –

Cuestiones relacionadas