ich arbeite mit VS2008 und NHibernate 3.1 und habe ein Problem beim Löschen von Elementen einer Auflistung in einer many-to-many Beziehung (n:m) in eine WinForms-Anwendung. Ich verwende eine Session per Form.
Also: Eine Klasse Employee erbt von einer Klasse Person und hat eine Auflistung von Teams (Public Overridable Property Teams() As ISet) zu der ein Employee gehören kann. Die Klasse Team hat im Gegenzug eine Auflistung von Employees (Public Overridable Property Employees() As ISet).
Die Mappings sehen so aus: Employee: <set name="Teams" table="EMPLOYEE_TEAM" lazy="true" inverse="false" cascade="none"> <key column="ID_PERSON"/> <many-to-many class="AbsenceManager.Team" column="ID_TEAM" order-by="ShortText"/> </set>
Und jetzt das Problem: Wenn ich das erste mal einem Employee Teams zuordne und ggf. die Zuordnung auch gleich wieder lösche klappt alles wunderbar. Die Junction-Table wird geändert (insert/delete). Schließe ich den Dialog und öffne ihn neu (d.h. neue Session), dann kann ich wieder hinzufügen und neu zugeordnete Teams aus der Auflistung entfernen. Aber die alten Team-Zuordnungen bekomme ich nicht weg. Das Löschen erfolgt über eine Methode der Employee-Klasse:
Public Overridable Sub RemoveTeam(ByVal t As Team) Try Me.Teams.Remove(t) t.Employees.Remove(Me) Catch ex As Exception [Session].Close() Throw New Exception(ex.Message, ex.InnerException) End Try End Sub
Using tx As ITransaction = session.BeginTransaction Try Employee.TemoveTeam(thisTeam) session.SaveOrUpdate([Employee]) tx.Commit()
C1ButtonSave.Enabled = False Catch ex As Exception tx.Rollback() End Try
Nhibernate bekommt in der neuen Session einfach nicht mit, dass an der Teams-Liste etwas geändert wurde. Es wird kein DELETE SQL-Statement erzeugt.
Wichtig: Employee und Team können unabhängig von einander existieren, d.h. nur weil ein Employee nicht mehr in einem Team ist, heißt das nicht, dass das Team gelöscht werden soll. Ich Lösche also immer nur Elemente aus der Auflistung, nicht die Teams selber.
Exakt! Es wird SQL zum update des Employee erzeugt, aber keines für delete! Ergo hat NHibernate das Entfernen von Teams aus der Teamsliste nicht mitbekommen. Nur warum?