Wie ändere ich die Eltern eines Kindes in NHibernate, wenn die Kaskade "Alle löschen" ist?
Ich habe zwei Entitäten in einer bidirektionalen Eins-zu-Viele-Beziehung:
public class Storage
{
public IList<Box> Boxes { get; set; }
}
public class Box
{
public Storage CurrentStorage { get; set; }
}
Und das Mapping:
<class name="Storage">
<bag name="Boxes" cascade="all-delete-orphan" inverse="true">
<key column="Storage_Id" />
<one-to-many class="Box" />
</bag>
</class>
<class name="Box">
<many-to-one name="CurrentStorage" column="Storage_Id" />
</class>
A Storage
kann viele @ habBoxes
, aber einBox
kann nur zu einem @ gehörStorage
. Ich habe sie so abgebildet, dass das Eins-zu-Viele eine Kaskade von @ hall-delete-orphan
.
Mein Problem tritt auf, wenn ich versuche, das @ einer Box zu ändeStorage
. Vorausgesetzt, ich habe diesen Code bereits ausgeführt:
var storage1 = new Storage();
var storage2 = new Storage();
storage1.Boxes.Add(new Box());
Session.Create(storage1);
Session.Create(storage2);
Der folgende Code gibt mir eine Ausnahme:
// get the first and only box in the DB
var existingBox = Database.GetBox().First();
// remove the box from storage1
existingBox.CurrentStorage.Boxes.Remove(existingBox);
// add the box to storage2 after it's been removed from storage1
var storage2 = Database.GetStorage().Second();
storage2.Boxes.Add(existingBox);
Session.Flush(); // commit changes to DB
Ich erhalte die folgende Ausnahme:
NHibernate.ObjectDeletedException: Gelöschtes Objekt wird durch Kaskade erneut gespeichert (gelöschtes Objekt aus Zuordnungen entfernen)
Diese Ausnahme tritt auf, weil ich die Kaskade auf @ gesetzt haall-delete-orphan
. Der ErsteStorage
hat festgestellt, dass ich das @ entfernt haBox
aus seiner Sammlung und markiert es zum Löschen. Als ich es jedoch zum zweiten @ hinzufügStorage
(in derselben Sitzung), versucht es, die Box erneut zu speichern und dasObjectDeletedException
ist geworfen
Meine Frage ist, wie bekomme ich dasBox
, um das übergeordnete @ zu ändeStorage
ohne auf diese Ausnahme zu stoßen? Ich weiß, dass eine mögliche Lösung darin besteht, die Kaskade auf nur @ zu änderall
, aber dann verliere ich die Fähigkeit, NHibernate automatisch ein @ löschen zu lassBox
durch einfaches Entfernen von einemStorage
und nicht erneut mit einem anderen assoziieren. Oder ist dies der einzige Weg, dies zu tun und ich muss @ manuell aufrufSession.Delete
auf der Box, um es zu entfernen?