Nhibernate - item aktualisiert seine ParentID auf null, anstatt gelöscht zu werden

8

Die Geschäftslogik innerhalb eines Prozesses ist:

  • beginne die Transaktion
  • fügt ein Objekt zu einer Sammlung hinzu
  • führe einen Fund ("somethingA")
  • durch
  • Löschen Sie diesen Eintrag abhängig vom vorherigen Schritt.
  • Commit-Transaktion

Ich benutze cascade all-delete-orphans und die inverse = true, beide in meiner Elternklasse. Wenn ich das Objekt aus der Sammlung lösche, setze ich .parentObj = null und entferne das Objekt aus der Sammlung.

Bei der Verwendung von TemplateFlushMode.Auto habe ich die Datenbank profiliert und folgendes getan:

  • Element einfügen
  • SELECT bezogen auf etwasA
  • UPDATE parentID (das FK zum Parent) des Items zu NULL

(das Einfügeelement ist fertig, weil ein find() ausgeführt wurde, um die Datenkonsistenz in der Datenbank zu gewährleisten). Die Auswahl ist abgeschlossen, und dann würde ich erwarten, dass DELETE ausgeführt wird ... aber ein Update auf parentID = null ist erledigt.

Beim Ausführen von Session.Flush() direkt vor Find() passiert Folgendes:

  • Element einfügen
  • SELECT bezogen auf etwasA
  • Element löschen

Bei Verwendung von TemplateFlushMode.Commit werden die Änderungen am Ende der Transaktion vorgenommen und das Element wird nie eingefügt:

  • SELECT bezogen auf etwasA

Die App, mit der ich arbeite, verwendet TemplateFlushMode.Auto , also frage ich mich, gibt es eine Erklärung, warum die Kaskadierung nicht funktioniert, wenn eine Auswahl zwischen einem Element hinzugefügt und dann in demselben entfernt wird Transaktion?

Ich weiß, die erste Antwort, die auftaucht, ist: "Füge kein Element zu einer Sammlung hinzu, wenn es danach entfernt wird". Aber ich ändere die Geschäftslogik lieber nicht.

Weiß jemand, warum anstelle von delete ein Update durchgeführt wird, wenn AUTO verwendet wird? (Bei Verwendung von Commit wird das Objekt nicht eingefügt)

    
Adrián Poplavsky 11.12.2011, 02:12
quelle

2 Antworten

1

Ich denke, Sie sollten die Option cascade="delete" in Ihrer Mapping-Datei verwenden, um bei delete

zu kaskadieren     
Helikaon 02.02.2012 10:07
quelle
0

Verwenden Sie eine Zwei-Wege-Eins-zu-viele-Bindung? Haben Sie not-null="true" für den Fremdschlüssel in der Tabelle details markiert? Können Sie bitte Ihre Mappings-XML-Datei zum besseren Verständnis posten?

Ich weiß, dass ich deine Frage nicht beantwortet habe, aber ich habe nicht genug Reputation, um stattdessen einen Kommentar zu schreiben.

    
AYK 26.12.2011 09:46
quelle