2011-05-06 10 views
5

İki sınıfım var. Biri Employee ve diğeri 'Employee' sınıfı ile sıfır veya bir ilişkisi olan EmployeeDetails adı verilir. Diğer bir deyişle, bu 'EmployeeDetails' sınıfına ek veri depolamamız gereken durumlar vardır, ancak bu mutlaka bir kural değildir. Db yapısı, 'EmployeeDetails' ile aynı kimliği paylaşan ebeveyn ile oldukça basittir.nHibernate, bir ile sıfır veya bir ilişki var

Sahip olduğum sorun,sınıfından 'EmployeeDetails' sınıfını siliyor, nesneyi null olarak ayarlamanın hile ve temizleme oturumlarını gerçekleştireceğini düşünürdüm ama DB'deki kayıt kaldırılmaz.

My eşleştirmeleri ... Hangi

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

... ve EmployeeDetails sınıf için ...

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

insersiyon ve güncellemeler

iyi çalışır, ama bulmak için mücadele ettik Bu, bu işlemi silme işlemi için yapar.

Herhangi bir yardım veya öneriler minnetle alınır ...

cevap

2

Maalesef hepsi silme-yetim henüz NHibernate içinde bire-bir ilişki için desteklenmez. Daha fazla ayrıntı için bu issue veya bu SO question'a bakın. Çalışanlar Ayrıntılarını kendi başınıza silmenin ya da bire-bire-öykünümü öykünecek bir etkinlik dinleyicisi kullanmanın başka bir yolu olmadığı anlaşılıyor. Nhibernate uygulanması değil büyük ise minnetle bu malzeme iş katmanı tarafından ele alınabilir

+0

Endişelenmeyin, en azından onun uzakta kapsüllü yüzden. Şerefe – SeanCocteau

0

EmployeeDetails haritalama doğru görünmüyor. Çalışana bire-bir eşleştirmenin de bire bir olması gerektiği gibi görünüyor, ancak tblDetails'ın Employee.Id değeri için bir sütunu olduğunu görmüyorum. Bu olmadan, hangi tblDetails satırının hangi Çalışana ait olduğunu bilmek için NHibernate'deki silme mantığı için iki yönlü bir ilişki kuramazsınız.

GÜNCELLEME:

Ben bire-bir ilişki haritasına nasıl bir good sample bulundu ama kesinlikle bire bir senaryo içindir. Bir ilişkinin var olup olmadığını belirlemek için çocuk masasının kontrol edilmesi gerektiğinden bahseder, bu nedenle burada geçerli olabilir, ancak kodunuzda bazı manuel kontroller içerebilir.