2010-03-05 21 views
6

silme basamakla vermez Çocuğun çocuk bir sette. (Ilgili parçalar)nhibernate I (i isimlerini basitleştirilmiş) ebeveynin çocuğu ebeveyn bir dizi</b><br> & çocuğun çocuk ebeveynin çocuğun <b>Veli adında ve 3 nesneleri</p> <p>, senaryo aşağıdaki gibidir çocuklara

ebeveyn şöyle

haritalama olan

<set name="parentset" 
    table="pc-table" 
    lazy="false" 
    fetch="subselect" 
    cascade="all-delete-orphan" 
    inverse="true"> 
    <key column=FK_ID_PC" on-delete="cascade"/> 
    <one-to-many class="parentchild,parentchild-ns"/> 
</set> 

ebeveynin çocuğu

<set name="childset" 
    table="cc-table" 
    lazy="false" 
    fetch="subselect" 
    cascade="all-delete-orphan" 
    inverse="true"> 
    <key column="FK_ID_CC" on-delete="cascade"/> 
    <one-to-many class="childschild,childschild-ns"/> 
</set> 

Ne ben başarmak istediğim i ebeveyn sildiğinizde, bir olacağını kaskatı çocuğun çocuğuna tüm yolu silin. Ama şu anda olan şey bu.

(bu haritalama testi amaçları içindir) bir üst varlık alma (iyi çalışıyor) artık

IQuery query = session.CreateQuery("from Parent where ID =" + ID); 
IParent doc = query.UniqueResult<Parent>(); 

silme bölümü

session.Delete(doc); 
transaction.Commit(); 

'null değeri ekleyemezsiniz' çözüldü ettikten sonra Basamaklı ve ters hata, bunun şimdi bu kodla her şeyi sileceğini umuyorum, ancak sadece ebeveyn siliniyor.

i kaçırılmaması gereken muhtemeldir benim haritalama şey kaçırmak mı? Doğru yönde herhangi bir ipucu, daha fazla hoş geldiniz!


Diego, yanıt için teşekkürler. (ve açıklama)

on-delete="cascade"'u kaldırmaya gittim, çünkü kodda olabildiğince fazla denetim yapmayı ve veritabanında bulunmamayı seviyorum.

aşağıda yayınlanmıştır kodunu (çalışma) sonucudur.

ebeveyn

<set name="parentset"  
    table="pc-table"  
    cascade="all-delete-orphan"  
    inverse="true" 
    batch-size="5">  
    <key column=FK_ID_PC"/>  
    <one-to-many class="parentchild,parentchild-ns"/>  
</set> 

ebeveynin çocuğu

<set name="childset"    
    table="cc-table"  
    cascade="all-delete-orphan" 
    batch-size="5" 
    inverse="true">    
    <key column="FK_ID_CC">    
    <one-to-many class="childschild,childschild-ns"/>    
</set> 

Umut bu aynı sorunla insanlara yardım!

cevap

6

tuşları on-delete="cascade" ayarlayarak, DB basamaklı işlemek izin vardır.

Şemanınızı NHibernate ile mi üretiyorsunuz?

Örneğini yeniden oluşturdum ve bu öznitelikle ve bu özellik olmadan iyi çalıştı. Bunu kaldırırken, NHibernate basamaklı yapar.

BTW, lazy="false" fetch="subselect" kullanarak varsayılan olarak yapmanız gereken bir şey değil. Bu öznitelikleri kaldırırsanız, on-delete="cascade"'u bırakın ve cascade'u save-update olarak değiştirin, yalnızca bir Ana Öğeyi almak ve silmek için iki seçeneğiniz olur.