Удалить дочернюю запись из родительской коллекции - PullRequest
9 голосов
/ 12 июня 2009

Я разрабатываю пример приложения, чтобы я мог изучить все тонкости NHibernate. Я борюсь с проблемой удаления. Я хочу иметь возможность удалить дочернюю запись, удалив ее из коллекции его родителей, а затем сохранив родительскую запись. Я установил двунаправленное отношение «один ко многим», и вставка / обновление работает отлично.

Вот мои отображения

Корзина:

<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" />

Я хотел бы позвонить basket.RemoveBasketItem(BasketItem item), а затем Session.SaveUpdate(basket), чтобы элемент корзины был удален. Это возможно?

Ответы [ 4 ]

18 голосов
/ 12 июня 2009

Изменить cascade="all" на cascade="all-delete-orphan".

cascade="all" удалит ваши дочерние записи, только если родитель будет удален.

2 голосов
/ 08 января 2010

У меня такой же сценарий, и я использовал cascade = "all-delete-orphan" в bagList, но когда я удаляю один дочерний элемент в коллекции, он также удаляет родительский объект.

0 голосов
/ 15 июля 2015

У меня была проблема, когда мои дочерние элементы возвращали упорядоченное перечисление.

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);
}

Я переместил порядок в свое отображение и вернул дочерние элементы, как для IEnumerable. Это сработало для меня!

0 голосов
/ 31 января 2012

У меня была та же проблема, что и у initforthemoney, из-за того, что я возвращал новый список в ReadOnly из моего сборщика. Я обнаружил, что могу продолжать использовать список ReadOnly, изменив стратегию доступа к свойствам коллекции с nosetter на field.

...