Fluent NHibernate Self Referencing Viele zu viele

9

Ich habe eine Entität namens Books, die eine Liste mit mehr Büchern mit dem Namen "RelatedBooks" haben kann.

Die abgekürzte Buch-Entität sieht so ähnlich aus:

%Vor%

So sieht das Mapping für diese Beziehung aus

%Vor%

Hier ist ein Beispiel für die Daten, die dann in der RelatedBooks-Tabelle generiert werden:

%Vor%

Das Problem tritt auf, wenn ich versuche, ein Buch zu löschen. Wenn ich das Buch lösche, das eine ID von 1 hat, funktioniert alles ok und die RelatedBooks-Tabelle hat die zwei entsprechenden Datensätze entfernt. Wenn ich jedoch versuche, das Buch mit der ID 3 zu löschen, erhalte ich den Fehler "Die DELETE-Anweisung steht im Konflikt mit der REFERENCE-Einschränkung" FK5B54405174BAB605 ". Der Konflikt ist in der Datenbank" Test ", Tabelle" dbo.RelatedBooks ", Spalte" RelatedBookId "aufgetreten "".

Grundsätzlich kann das Buch nicht gelöscht werden, weil der Datensatz in der Tabelle "RelatedBooks", der eine "RelatedBookId" von 3 enthält, niemals gelöscht wird.

Wie kann ich diesen Datensatz löschen, wenn ich ein Buch lösche?

BEARBEITEN

Nach dem Ändern der Cascade von SaveUpdate () zu All (), das gleiche Problem besteht immer noch, wenn ich versuche, das Buch mit einer ID von 3 zu löschen. Auch mit Cascade auf All (), wenn das Buch mit und ID löschen von 1, dann werden alle 3 Bücher (IDs: 1, 2 und 3) gelöscht, so dass auch das nicht funktioniert.

Betrachtet man die SQL, die ausgeführt wird, wenn die Book.Delete () -Methode aufgerufen wird, wenn ich das Buch mit einer ID von 3 lösche, sieht es so aus, als ob die SELECT-Anweisung die falsche Spalte betrachtet (was bedeutet, dass die SQL DELETE-Anweisung würde den gleichen Fehler machen, daher nie diesen Datensatz entfernen). Hier ist die SQL für das verwandte Buch

%Vor%

Die WHERE-Anweisung sollte für diesen speziellen Fall ungefähr so ​​aussehen:

%Vor%

LÖSUNG

Hier ist, was ich tun musste, damit es in allen Fällen funktioniert

Zuordnung:

%Vor%

Code:

%Vor%     
Jeremy 05.02.2010, 23:22
quelle

2 Antworten

4

Anstatt das kaskadierte Attribut zu setzen, müssen Sie die Kollektion von RelatedBooks einfach leeren, bevor Sie ein Buch löschen.

%Vor%

Überlappende Löschvorgänge werden normalerweise nicht in einer Viele-zu-Viele-Beziehung ausgeführt, da sie das Objekt am anderen Ende der Beziehung löschen, in diesem Fall ein Buch.

    
Jamie Ide 08.02.2010, 15:26
quelle
0

Das wurde gerade aktualisiert:

Ссылка

    
Matthew McLeod 04.05.2010 16:55
quelle