Ich habe ein übergeordnetes Objekt, das eine Eins-zu-Viele-Beziehung zu einer IList von untergeordneten Objekten hat. Was ist der beste Weg, um die untergeordneten Objekte zu löschen? Ich lösche den Elternteil nicht. Mein übergeordnetes Objekt enthält eine IList mit untergeordneten Objekten. Hier ist die Zuordnung für die Eins-zu-Viele-Beziehung:
<bag name="Tiers" cascade="all">
<key column="mismatch_id_no" />
<one-to-many class="TGR_BL.PromoTier,TGR_BL"/>
</bag>
Wenn ich versuche, alle Objekte mit clear () aus der Sammlung zu entfernen, und dann SaveOrUpdate () aufrufe, wird folgende Ausnahme angezeigt:
System.Data.SqlClient.SqlException: Cannot insert the value NULL into column
Wenn ich versuche, die untergeordneten Objekte einzeln zu löschen und sie dann aus dem übergeordneten Objekt zu entfernen, wird eine Ausnahme angezeigt:
deleted object would be re-saved by cascade
Ich beschäftige mich zum ersten Mal mit dem Löschen von untergeordneten Objekten in NHibernate. Was mache ich falsch?
Bearbeiten: Nur zur Verdeutlichung - Ich versuche NICHT, das übergeordnete Objekt zu löschen, sondern nur die untergeordneten Objekte. Ich habe die Beziehung als eine zu viele auf dem Elternteil eingerichtet. Muss ich auch eine Viele-zu-Eins-Beziehung für die untergeordnete Objektzuordnung erstellen?
quelle
Gemäß Chucks Antwort habe ich mein Problem durch Hinzufügen von Inverse = true in der übergeordneten Seitenzuordnung gelöst:
Nachricht hat viele MessageSentTo:
[HasMany(typeof(MessageSentTo), Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Inverse = true)] public IList<MessageSentTo> MessageSendTos { get { return m_MessageSendTo; } set { m_MessageSendTo = value; } }
Ich benutze Castle ActiveRecord. Danke Chuck.
quelle
Versuchen Sie, merge () anstelle von saveOrUpdate () zu verwenden. Stellen Sie außerdem sicher, dass Ihre Kaskade auf "All-Delete-Orphan" eingestellt ist und dass Ihre Eltern-Kind-Beziehung invertierbar ist (invers = true für das übergeordnete Element und dann ein Feld im untergeordneten Element, das die übergeordnete ID mit not-null = true ist). .
quelle
In unserem Beispiel haben wir Kategorien mit vielen Produkten, in denen ein Produkt nicht nullwertfähig ist.
Sie können das Problem umgehen, indem Sie das Produkt löschen und vor dem Flush aus der Sammlung der Eltern entfernen. Wir suchen jedoch noch nach einer besseren Lösung für dieses Problem.
Hoffe es hilft trotzdem
quelle
Ändern Sie den Kaskadenattributwert von "all" in "all-delete-orphan".
quelle
Setzen Sie in Ihrer Zuordnung für die Spalte, die das Problem verursacht, Not-Null = true. Ich bin mir jedoch nicht sicher über die genaue Syntax (sorry).
quelle