2011-05-06 14 views
5

Tengo dos clases. Uno se llama Employee y el otro EmployeeDetails que tiene una relación cero o uno con su clase primaria 'Employee'. En otras palabras, hay ocasiones en las que necesitamos almacenar datos adicionales en esta clase 'EmployeeDetails', pero esta no es necesariamente la norma. La estructura db es bastante simple con el 'EmployeeDetails' compartiendo el mismo ID que su padre.nHibernar, uno a cero o una relación aflicciones

El problema que tengo es eliminar la clase 'EmployeeDetails' de la clase 'Employee', hubiera imaginado que establecer el objeto a nulo hubiera hecho las sesiones de trucos y enrojecimiento, pero el registro en la base de datos no se elimina.

Mis asignaciones son ...

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="StudioBusinessLayer.Data.Structure.Employee, StudioBusinessLayer" table="tblEmployee" lazy="false"> 
     <id name="ID" column="ID" type="int"> 
      <generator class="native" /> 
     </id> 

     <property name="Name" column="Name" not-null="true" type="string" length="100" /> 
     <!-- etc --> 

     <one-to-one constrained="false" name="EmployeeDetails" class="StudioBusinessLayer.Data.Structure.EmployeeDetails, StudioBusinessLayer" cascade="all-delete-orphan" /> 

    </class> 
</hibernate-mapping> 

... y para la clase EmployeeDetails ...

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="StudioBusinessLayer.Data.Structure.EmployeeDetails, StudioBusinessLayer" table="tblDetails" lazy="false"> 
     <id name="ID" column="DetailsID" type="int"> 
      <generator class="foreign"> 
       <param name="property">Employee</param> 
      </generator> 
     </id> 

     <property name="Address" column="Address" not-null="false" type="string" length="1000" /> 
     <property name="ContactEmail" column="ContactEmail" not-null="false" type="string" length="255" /> 
     <property name="ContactName" column="ContactName" not-null="false" type="string" length="255" /> 
     <property name="ContactTelephone" column="ContactTelephone" not-null="false" type="string" length="255" /> 
     <property name="ZipCode" column="ZipCode" not-null="true" type="string" length="100" /> 

     <many-to-one name="Employee" class="StudioBusinessLayer.Data.Structure.Employee, StudioBusinessLayer" column="DetailsID" insert="false" update="false"></many-to-one> 

    </class> 
</hibernate-mapping> 

Las inserciones y actualizaciones funcionan bien, pero he estado luchando para encontrar la interruptor que hace que esto funcione para eliminaciones.

Cualquier ayuda o sugerencias son bien recibidas ...

Respuesta

2

Lamentablemente, all-delete-huérfano aún no es compatible con la relación uno-a-uno en NHibernate. Consulte esto issue o este SO question para obtener más detalles. Parece que no hay otra manera más que eliminar EmployeeDetails por su cuenta o usar un detector de eventos que emulará todo-eliminar-huérfano para uno-a-uno.

+0

No hay preocupaciones, afortunadamente esto puede ser manejado por la capa de negocios, así que, aunque la implementación de nHibernate no es buena, al menos está encapsulada. Aclamaciones – SeanCocteau

0

El mapeo EmployeeDetails no se ve bien. Parece que el mapeo de muchos a uno para el empleado también debe ser uno a uno, pero no veo que tblDetails tenga una columna para el valor Employee.Id. Sin él no puede establecer una asociación bidireccional para la lógica de eliminación en NHibernate para saber qué fila tblDetails pertenece a cada empleado.

ACTUALIZACIÓN:

me encontré con un good sample de cómo mapear las relaciones de uno a uno, sino que es estrictamente para el uno-a-uno de los escenarios. Menciona que la tabla secundaria debería verificarse para determinar si existe una asociación, por lo que puede ser aplicable aquí, pero podría implicar una verificación manual en el código.

Cuestiones relacionadas