Laden...

Webanwendungen und NHibernate, funktioniert das überhaupt?

Erstellt von barzefutz vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.862 Views
B
barzefutz Themenstarter:in
95 Beiträge seit 2007
vor 13 Jahren
Webanwendungen und NHibernate, funktioniert das überhaupt?

Hallo,

ich versuche momentan, meine ASP.NET Webanwendung auf NHibernate umzustellen. Es ging beispielsweise um folgende Aufgabenstellung:

  • Daten aus einer Datenbank holen
  • Diese Daten in einem Formular anzeigen, welches vom Benutzer editiert werden kann
  • Nach dem Bearbeiten die geänderten Daten speichern

Die ersten beiden Schritte funktionieren tadellos, aber beim letzten Schritt komme ich nicht weiter. Um die Daten mit NHibernate wieder zu speichern, bräuchte ich ja das ursprüngliche Entity-Objekt aus dem ersten Schritt, damit ich dessen Eigenschaften ändern kann. Dieses Objekt ist aber nicht mehr vorhanden, weil inzwischen ein Postback stattgefunden hat. Das heisst, ich muss das Entity-Objekt extra nochmal aus der Datenbank holen, nur um es zu ändern und wieder zurückspeichern. Das ist ja quasi eine überflüssige SQL-Abfrage, die nicht sein müsste (Select und Update, in einer klassischen Anwendung wäre nur das Update vonnöten). Es gibt in Hibernate zwar auch die Möglichkeit, SQL-Abfragen in einer SQL-artigen Mittelsprache auszuführen, diese Sprache genügt jedoch leider nicht meinen Anforderungen.

Hat jemand eine Idee, wie man das am elegantesten lösen könnte?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

ich kenne mich mit NHibernate zwar nicht aus, aber kannst Du das Objekt nicht einfach in der Session ablegen?

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

B
barzefutz Themenstarter:in
95 Beiträge seit 2007
vor 13 Jahren

Hallo,

danke für die schnelle Antwort. Die Überlegung hatte ich noch gar nicht. Das würde bestimmt gehen, aber es das Problem könnte sein, dass die Daten viel zu groß dafür sind. Nehmen wir mal an, man transportiert die Daten einer Hundert-Zeilen-Tabelle über die Session, das wäre ja ein ziemlich großer Overhead und daher auch keine recht befriedigende Lösung. Man müsste die Daten ja quasi duplizieren, einmal für die Anzeigeelemente (GridView etc) und einmal als Entity-Objekte für Hibernate.

Ich habe mir gerade mal ein paar Beispielanwendungen angeschaut, dort wurde auch dieser Ansatz gewählt (das Objekt wurde allerdings nicht in der Session, sondern im ViewState abgelegt... das ist ja im Prinzip Jacke wie Hose). Aber irgendwie kann ich mich damit nicht so recht anfreunden.

G
46 Beiträge seit 2010
vor 13 Jahren

Ich habe mit NHibernate nur ein wenig herumgespielt, aber IMHO müsste es gehen, wenn Du Dir in der Session nur die ID Felder merkst. Diese hast Du in Deinem XML-Mapping angegeben.

Aus den HTTP POST Daten kannst Du Dir die restlichen Felder ja wieder holen.

1.433 Beiträge seit 2006
vor 13 Jahren

Vielleicht findest Du hier ein paar Hinweise.

Wenn ich mich recht entsinne, dann müsste, wenn ein Objekt geändert worden ist, NHibernate aufgrund seines IsDirty Property auf dem Objekt, das Objekt selber speichern, wenn dieses auf true ist (dann ist's ja geändert).

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

S
14 Beiträge seit 2007
vor 13 Jahren

Hallöchen.

Das Thema lässt sich mit dem Terminus session per conversation umschreiben. Session per conversation speichert die Session halt nicht nur im aktuellen Request, sondern spannt diese weiter.

Eine Erweiterung für NHIbernate ist Burrow. Dieses Framwork kannst du dir mal anschauen:

Ein anderer Einstieg in Session per conversation ist am Ende von Video 13 des 'Summer of NHIbernate (sehr gute Serie, btw).

Gruss

B
barzefutz Themenstarter:in
95 Beiträge seit 2007
vor 13 Jahren

Hallo Schue,

ich habe mir das Beispiel mit großem Interesse angeschaut. Die Burrow-Erweiterung hat ja an sich nichts mit meinem Problem zu tun, oder? Das eigentlich Interessante an dem dazugehörigen Beispiel ist das wwDataBinder-Control, das es ermöglicht, die Daten aus den Datengebundenen Steuerelementen automatisch in ein Entitätsobjekt zurückzuführen. Leider habe ich nichts dazu gefunden, ob das auch mit GridViews funktioniert??

Vielleicht hätte ich mein Problem besser konkretisieren sollen, damit klarer wird woran es hängt. Also, ich habe ein GridView, welches die Daten von NHibernate bezieht und anzeigt. Für jeden Datensatz des GridView gibt es einen Button, mit dem man eine Eigenschaft des Datensatzes zwischen True/False hin- und herschalten kann. Wenn ich jetzt den Button anklicke, kann ich zwar den Primärschlüssel des angeklickten Datensatzes herausfinden, aber in Bezug auf NHibernate hilft mir das nicht. Ich brauche ja nicht nur den Primärschlüssel, sondern das komplette Objekt, um es mit NHibernate updaten zu können. Da wäre es natürlich gut, wenn das Objekt vorher irgendwo zwischengespeichert wurde, damit ich es nicht extra nochmal aus der Datenbank holen muss.

Das mit "Session per conversation" scheint dann ja das zu sein, was ich brauche, Ich werde mich da mal einlesen. Vielen Dank schonmal!

@schaedld:

Danke, ich habe mir das Beispiel sehr genau angeschaut. Aber wenn mich nicht alles täuscht, macht der genau das, was ich vermeiden wollte. Bevor er beispielsweise einen Kunden updatet, holt er nochmal ein Kunden-Objekt aus der Datenbank, nur um es zu updaten.