6

Das Szenario wird wie folgtnhibernate nicht kaskadieren nicht löschen Kinder

Ich habe 3 Objekte (i die Namen vereinfacht) genannt Elternteil, Eltern Kind & Kind des Kindes
Elternteil des Kindes ein Satz in Eltern ist, und Kindes Kind ist ein Set in Kind.

Zuordnung ist wie folgt (relevante Teile)

Eltern

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

Kind der Eltern

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

Was ich erreichen möchte, ist, dass, wenn ich die Eltern löschen, würde es sein, kaskadieren Sie den ganzen Weg durch das Kind des Kindes. Aber was momentan passiert ist das.

(dies ist lediglich für die Zuordnung Prüfzwecke) eine Muttergesellschaft bekommen (funktioniert)

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

jetzt die Lösch Teil

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

Nach der ‚Nullwert nicht einfügen‘ gelöst hat Fehler mit Kaskadierung und inverse Ich hoffe, dass dies jetzt alles mit diesem Code löschen würde, aber nur der Elternteil gelöscht wird.

Habe ich etwas in meinem Mapping übersehen, das wahrscheinlich übersehen wird? Jeder Hinweis in die richtige Richtung ist mehr als willkommen!


Diego, danke für die Antwort auf den Punkt. (und Erklärung)

Ich ging mit dem Entfernen der on-delete="cascade", weil ich so viel Kontrolle wie möglich in Code und nicht in der Datenbank mag.

Der unten angegebene Code ist das (Arbeits) -Ergebnis.

Eltern

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

Eltern Kind

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

hoffe, das hilft Menschen mit dem gleichen Problem!

Antwort

6

Wenn Sie on-delete="cascade" auf die Tasten setzen, lässt die DB die Kaskadierung verarbeiten.

Generieren Sie Ihr Schema mit NHibernate?

Ich reproduzierte nur Ihr Beispiel und es funktionierte gut mit und ohne dieses Attribut. Beim Entfernen führt NHibernate die Kaskadierung durch.

BTW, mit lazy="false" fetch="subselect" ist nicht etwas, das Sie standardmäßig tun sollten. Wenn Sie diese Attribute entfernen, lassen Sie on-delete="cascade" und ändern Sie cascade zu save-update, Sie haben nur zwei Abfragen zum Abrufen und Löschen eines Parents.