Die Geschäftslogik innerhalb eines Prozesses ist:
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:
(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:
Bei Verwendung von TemplateFlushMode.Commit
werden die Änderungen am Ende der Transaktion vorgenommen und das Element wird nie eingefügt:
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)
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.
Tags und Links c# nhibernate nhibernate-mapping