Laden...

Nhibernate / Castle.ActiveRecord: "Unnötiges" Update

Erstellt von Lecrell vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.121 Views
L
Lecrell Themenstarter:in
120 Beiträge seit 2007
vor 11 Jahren
Nhibernate / Castle.ActiveRecord: "Unnötiges" Update

Hallo zusammen,

wir verwenden in unserem Windows.Forms Projekt Nhibernate mit Castle.ActiveRecord. In diesem Projekt gibt es ein Objekt A welches eine List<B> hat.
Wenn ich nun die Sortierung der Liste ändere sendet Nhibernate ein Update an die DB und setzt die VersionId-Spalte (NHibernateVersion) von Objekt A hoch.
Gibt es eine Möglichkeit dieses Update zu verhindern?

Danke,
Lecrell

106 Beiträge seit 2011
vor 11 Jahren

Hallo Lecrell,

deine Frage ist zwar schon ein paar Tage her, aber ich hoffe ich komme nicht zu spät 😉
Wenn ich deine Frage richtig verstanden(Ich habe leider keinerlei erfahrung mit Castle.ActiveRecord) habe, dann sortierst du die Collection direkt auf der Entität. Sowas sollte man eigentlich nicht machen, es sei denn du willst das die Entität mit der neuen Sortierung und der neuen Versionsnummer gespeichert wird.

Ich nehme mal an das diese Collection Lazy ist. Somit wird sie durch einen Proxy auf der Entität repräsentiert, wenn du also die einzelnen Elemente des Proxys (aus deiner Sicht die Collection) umsortierst, so kriegt das NHibernate mit und setzt natürlich die Versionsnummer hoch.

Du kannst das ganze umgehen wenn du einfach eine Kopie der Liste erstellst z.B.:


var neueCollection = Collection.ToList();

und auf dieser Liste weiterarbeitest.

MfG
Rabban

L
Lecrell Themenstarter:in
120 Beiträge seit 2007
vor 11 Jahren

Hey Rabban,

das ist genau das was wir als Workaround gemacht haben. Wir wollten aber eigntl. eine Lösung, welche die Sortierung direkt auf der Entität zulässt,
da wir die Liste verwenden möchten ohne immer an die Sortierung denken zu müssen.

?( ?( ?(

Lecrell

16.834 Beiträge seit 2008
vor 11 Jahren

In diesem Projekt gibt es ein Objekt A welches eine List<B> hat.

Eine Entität sollte keine List<T> haben, sondern eine virtual Collection<T>. Dies verhinderte eine direkte Materialisierung (siehe unten).

da wir die Liste verwenden möchten ohne immer an die Sortierung denken zu müssen.

Benutzt man denn bei NHibernate keine Repositories, wo man solche Abfragen standardisieren kann?

Beim EntityFramework hat ein ToList (also ein "cast" auf List<T>) aber die Folge, dass ALLE Entitäten vom Server geladen werden - und anschließend Abfragen auch nicht mehr auf der SQL-Seite ausgeführt werden. Daher sollte man mit einer Materialisierung durch ToList mit Bedacht umgehen.

106 Beiträge seit 2011
vor 11 Jahren

@Lecrell:
Man kann im Mapping der Entität definieren ob und wonach die Collections sortiert sein sollen, habt ihr das schonmal probiert? Sorted Collections

@Abt:

Eine Entität sollte keine List<T> haben, sondern eine virtual Collection<T>. Dies verhinderte eine direkte Materialisierung (siehe unten).

Das hast du recht, aber ich gehe davon aus das er eine virtual IList<T> oder etwas vergleichbares nutzt. Somit wird zwar die Collection initialisiert, aber die Daten werden noch nicht vom Server geladen, erst beim zugriff auf die Collection.

Benutzt man denn bei NHibernate keine Repositories, wo man solche Abfragen standardisieren kann?

Soweit ich weiß bringt bringt NHibernate sowas von zu hause aus nicht mit. Aber es ist eine gängige Vorgehensweise hier welche zu nutzen.
Ich denke aber das ist von Projekt zu Projekt unterschiedlich. Am sinnigsten wäre es aber wohl wirklich, wenn ihr euch ein Repository schreibt das die Collection zu dieser Entität in der Sortierung zurück gibt, wie ihr es braucht.
Somit wäre die neue Collection auch Lazy und ihr könnt darin wild rumsortieren oder verändern wie ihr wollt, ohne die Versionsnummer von Entität A zu verändern.

MfG
Rabban