2011-05-06 67 views
5

我有兩個類。一個稱爲Employee,另一個稱爲EmployeeDetails,與其父類'Employee'有零或一個關係。換句話說,有些時候我們需要將額外的數據存儲到這個'EmployeeDetails'類中,但這不一定是標準。數據庫結構非常簡單,'EmployeeDetails'與其父級共享相同的ID。nHibernate,一對零或一個關係woes

我得到的問題是從'Employee'類中刪除'EmployeeDetails'類,我會想象將對象設置爲null會完成技巧和刷新會話,但DB中的記錄不會被刪除。

我的映射是...

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

...併爲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> 

插入和更新工作正常,但我一直在努力尋找開關,使這項工作刪除。

任何幫助或建議感激地收到...

回答

2

不幸的是,在NHibernate中,一對一關係不支持all-delete-orphan。有關更多詳細信息,請參閱此issue或此SO question。似乎沒有其他辦法可以通過您自己的方式刪除EmployeeDetails,也可以使用一個事件偵聽器來模擬一對一的all-delete-orphan。

+0

不用擔心,幸好這個東西可以被業務層處理,所以雖然nHibernate的實現並不是很好,至少它的封裝了。乾杯 – SeanCocteau 2011-05-09 09:08:07

0

EmployeeDetails映射看起來不正確。看起來像Employee的多對一​​映射也應該是一對一的,但我沒有看到tblDetails有一個Employee.Id值的列。沒有它,你不能建立NHibernate的刪除邏輯的雙向關聯,以知道哪個tblDetails行屬於哪個Employee。

UPDATE:

我找到了如何在一到一個關係映射good sample但它是嚴格一到一個場景。它確實提到需要檢查子表以確定是否存在關聯,以便在此處適用,但可能需要在代碼中進行一些手動檢查。