2009-06-12 3 views
8

Ich entwickle eine Beispielanwendung, damit ich die Grundlagen von NHibernate lernen kann. Ich habe Probleme mit einem Löschproblem. Ich möchte in der Lage sein, einen untergeordneten Datensatz zu löschen, indem ich ihn aus der Auflistung seiner übergeordneten Elemente lösche und dann den übergeordneten Datensatz speichere. Ich habe eine bidirektionale Eins-zu-viele-Beziehung eingerichtet und das Einfügen/Aktualisieren funktioniert großartig.Löschen eines untergeordneten Datensatzes aus der übergeordneten Sammlung

Hier sind meine Zuordnungen

Basket:

<bag name="Items" inverse="true" cascade="all"> <key column="BasketId" /> <one-to-many class="BasketItem" /> </bag>

BasketItem:

<many-to-one not-null="true" name="Basket" column="BasketId" />

Ich möchte basket.RemoveBasketItem(BasketItem item) rufen dann Session.SaveUpdate(basket), so dass der Korbposition wird gelöscht . Ist das möglich?

Antwort

16

Ändern Sie cascade="all" in cascade="all-delete-orphan".

cascade="all" löscht nur Ihre untergeordneten Datensätze, wenn das übergeordnete Element gelöscht wird.

+0

Wenn mein RemoveBasketItem wie folgt aussieht: this.basketItems.Remove (itemToRemove); Ich erhalte diesen Fehler: Eine Sammlung mit cascade = "all-delete-orphan" wurde von der besitzenden Entity-Instanz nicht mehr referenziert: Basket.Items –

+7

Klingt so, als hättest du irgendwie die 'IList'-Referenz überschrieben, die deine Warenkorb-Objekte enthält. Sie können nur Ihre eigene Implementierung von 'IList' dort einfügen, wenn der Listenverweis null ist - wenn Sie einen Korb aus der DB laden, wird NH seinen eigenen' PersistentBag' als 'IList'-Implementierung angeben - und Sie müssen diesen Verweis belassen allein, damit Kaskade richtig funktioniert. – mookid8000

+1

Ich habe es zur Arbeit gebracht! Vielen Dank für Ihre Hilfe :-) Ich hatte Probleme, weil meine basket.Items -Eigenschaft eine schreibgeschützte Liste aufbaute. Jetzt gebe ich einfach die private Instanz meiner Artikel zurück. –

2

Ich habe dasselbe Szenario und IVE verwendet Kaskade = "All-Delete-Orphan" in BagList, aber wenn ich ein einzelnes Kind Element in einer Sammlung löschen, löscht es auch das Elternobjekt.

+1

Stellen Sie sicher, dass Ihr untergeordnetes Objekt Kaskade hat = "none" –

+0

Danke für den Kommentar .... das ist der fehlende Link in den meisten Online-Einträgen !!! – Jonathan

+0

+1 Million, half mir da, wo die meisten Online-Ressourcen nicht erwähnen, wie Jonathan sagte. Danke! –

0

Ich hatte das gleiche Problem wie initthemoney wegen der Rückgabe einer neuen Liste als ReadOnly aus meiner Sammlung Getter. Ich fand heraus, dass ich die ReadOnly-Liste weiterhin verwenden konnte, indem ich die Eigenschaftszugriffsstrategie der Sammlung von nosetter auf field änderte.

0

Ich hatte ein Problem, wo meine Kinder Elemente, die eine geordnete Auflistung zurückgegeben werden.

private readonly IList<Child> children; 

public virtual IEnumerable<Child> Children { get { return children.OrderBy(c => c.Position); } } 

public virtual void DeleteChild(Child item) 
{ 
    children.Remove(item); 
} 

Ich habe die Reihenfolge in meine Zuordnung verschoben und die untergeordneten Elemente wie für IEnumerable zurückgegeben. Das hat für mich funktioniert!