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?

War es hilfreich?

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 Bases 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 Bs, die Cs (und so weiter) enthält, es nicht versucht, all Cs zu löschen, wenn die Sammlung von Bs 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, was

Fazit

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top