Wie kann man ein Unternehmen in nhibernate mit nur seine ID und Typ löschen?
-
19-09-2019 - |
Frage
Ich frage mich, wie kann man eine Einheit löschen Sie einfach die ID und die Art, die (wie in Abbildung) mit NHibernate 2.1?
Lösung
Wenn Sie ein träges Laden verwenden, laden erzeugt nur einen Proxy.
session.Delete(session.Load(type, id));
Mit 2,1 NH können Sie HQL verwenden. Nicht sicher, wie es tatsächlich aussieht, aber so etwas wie folgt aus: Beachten Sie, dass dieses Thema für SQL-Injection ist - , wenn möglich, die Verwendung parametrisierte Abfragen statt mit SetParameter ()
session.Delete(string.Format("from {0} where id = {1}", type, id));
Edit:
Für laden, brauchen Sie nicht den Namen der Spalte von Id kennen.
Wenn Sie es wissen müssen, Sie können es durch die NH-Metadaten:
sessionFactory.GetClassMetadata(type).IdentifierPropertyName
Eine andere bearbeiten.
session.Delete()
ist Instanziieren das Unternehmen
Wenn session.Delete () verwendet wird, lädt NH das Unternehmen trotzdem. Am Anfang habe ich mag es nicht. Dann erkannte ich, die Vorteile. Wenn das Unternehmen Teil einer komplexen Struktur ist mit Vererbung, Sammlungen oder „all“ -Referenzen, ist es eigentlich effizienter.
Zum Beispiel, wenn Klasse A
und B
beide erben von Base
, es nicht versucht, Daten in Tabelle B
zu löschen, wenn die tatsächliche Einheit vom Typ A
ist. Dies wäre nicht möglich, ohne das eigentliche Objekt zu laden. Dies ist besonders wichtig, wenn es viele vererbten Typen sind, die auch jeweils viele zusätzliche Tabellen bestehen.
Die gleiche Situation gegeben ist, wenn Sie eine Sammlung von Base
s haben, die alle Instanzen A
passieren. Wenn die Sammlung in dem Speicher zu laden, NH weiß, dass es kein B
-Material entfernen muss.
Wenn das Unternehmen A
hat eine Sammlung von B
s, die C
s (und so weiter) enthält, es nicht versucht, all C
s zu löschen, wenn die Sammlung von B
s leer. Dies ist nur möglich, wenn die Sammlung zu lesen. Dies ist besonders wichtig, wenn C-Komplex der eigenen, auch mehr Tabellen aggregieren und so weiter.
Je komplexer und dynamischer die Struktur ist, desto effizienter ist es tatsächlich Daten anstelle von „blind“ es löschen zu laden.
HQL Löscht have Fallen
HQL löscht nicht Daten in den Speicher zu laden. Aber HQL-Löschungen sind nicht so intelligent. Sie übersetzen grundsätzlich die Entity-Namen in den entsprechenden Tabellennamen, und entfernen Sie das aus der Datenbank. Darüber hinaus löscht einige aggregierte Sammlungsdaten.
In einfachen Strukturen, kann dies gut und effizient arbeiten. In komplexen Strukturen auf Constraint-Verletzungen oder „Datenbank Speicherlecks“.
nicht alles gelöscht, wasFazit
Ich habe auch versucht zu optimieren Deletion mit NH. Ich habe in den meisten Fällen, denn NH noch schlauer ist, es „einfach funktioniert“ und ist in der Regel schnell genug. Eines der komplexesten Löschalgorithmen Ich schrieb analysiert NH-Mapping-Definitionen und den Aufbau Delete-Anweisungen aus, dass. Und - keine Überraschung - es ist nicht möglich, ohne Daten aus der Datenbank zu lesen, vor dem Löschen. (I reduziert nur es nur Primärschlüssel geladen werden.)