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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage