| 

.NET C# Java Javascript Exception

2
Hallo Leute,

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>

Team:
<set name="Employees" table="EMPLOYEE_TEAM" lazy="true" inverse="false" cascade="none">
<key column="ID_TEAM"/>
<many-to-many class="AbsenceManager.Employee" column="ID_PERSON" order-by="DisplayName"/>
</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.

Was mache ich falsch? wo ist mein Denkfehler
12.09.2011
yammi900 93 4
Nur zur Sicherheit: es fliegt keine Exception, die einen Rollback auslösen würde?
Matthias Hlawatsch 12.09.2011
2 Antworten
0
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?
12.09.2011
yammi900 93 4
1
Das wäre besser ein Kommentar zur Frage geworden, damit klar ist, worauf Du Dich beziehst.
Matthias Hlawatsch 12.09.2011
Gelobe Besserung, beim nächsten mal...
yammi900 12.09.2011
0
Ok, vorläufige Lösung:

  • Mapping beim Team inverse="true" statt "false"
    <set name="Employees" table="EMPLOYEE_TEAM" lazy="true" inverse="true" cascade="none">

Eine Seite der Relation muss halt immer inverse="true" sein.
12.09.2011
yammi900 93 4
Das dürfte die vorläufig-endgültige Lösung sein ;-)

Mist, und ich dachte, ich hätte da dreimal hingeschaut. Immerhin interessant, dass das diese Konsequenz hat.
Matthias Hlawatsch 12.09.2011

Stelle deine Nhibernate-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH