Mam obiekt nadrzędny, który ma relację jeden do wielu z IListą obiektów potomnych. Jaki jest najlepszy sposób na usunięcie obiektów podrzędnych? Nie usuwam rodzica. Mój obiekt nadrzędny zawiera IList obiektów podrzędnych. Oto mapowanie relacji jeden do wielu:
<bag name="Tiers" cascade="all">
<key column="mismatch_id_no" />
<one-to-many class="TGR_BL.PromoTier,TGR_BL"/>
</bag>
Jeśli spróbuję usunąć wszystkie obiekty z kolekcji za pomocą clear (), a następnie wywołam SaveOrUpdate (), otrzymam ten wyjątek:
System.Data.SqlClient.SqlException: Cannot insert the value NULL into column
Jeśli spróbuję indywidualnie usunąć obiekty podrzędne, a następnie usunę je z rodzica, pojawia się wyjątek:
deleted object would be re-saved by cascade
Po raz pierwszy mam do czynienia z usuwaniem obiektów podrzędnych w NHibernate. Co ja robię źle?
edycja: tylko dla wyjaśnienia - NIE próbuję usunąć obiektu nadrzędnego, tylko obiekty podrzędne. Mam związek z rodzicem jako jeden do wielu. Czy muszę również utworzyć relację wiele do jednego w mapowaniu obiektów podrzędnych?
źródło
Zgodnie z odpowiedzią Chucka rozwiązałem swój problem, dodając Inverse = true w mapowaniu strony rodzica:
Wiadomość zawiera wiele MessageSentTo:
[HasMany(typeof(MessageSentTo), Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Inverse = true)] public IList<MessageSentTo> MessageSendTos { get { return m_MessageSendTo; } set { m_MessageSendTo = value; } }
Używam Castle ActiveRecord. Dziękuję Chuck.
źródło
Spróbuj użyć merge () zamiast saveOrUpdate (). Upewnij się również, że kaskada jest ustawiona na all-delete-orphan i że relacja rodzic-dziecko jest odwracalna (inverse = true na rodzicu, a następnie pole w dziecku, które jest identyfikatorem rodzica z not-null = true) .
źródło
W naszym przykładzie mamy kategorie z wieloma produktami, w których produkt nie dopuszcza wartości null.
Możesz obejść ten problem, usuwając produkt i usuwając go z kolekcji rodzica przed usunięciem, ale wciąż szukamy lepszego rozwiązania tego problemu.
Mam nadzieję, że to i tak pomoże
źródło
Zmień wartość atrybutu kaskadowego z „all” na „all-delete-orphan”.
źródło
ustaw Not-Null = true w mapowaniu w kolumnie powodującej problem. Nie jestem jednak pewien dokładnej składni (przepraszam).
źródło