Свободная проблема удаления каскада NHibernate - PullRequest
1 голос
/ 03 декабря 2010

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

Вот мои объекты:

public class Parent
{
    public int Id { get; set; }
    public IList<SequencedChild> SequencedChildren { get; set; }
}

public class SequencedChild 
{
    public int Id { get; set; }
    public int ParentId { get; set; }
    public int ChildId { get; set; }
    public int Sequence { get; set; }
}

public class Child 
{
    public int Id { get; set; }
}

А вот мое отображение:

HasMany(m => m.SequencedChildren).Inverse().Cascade.Delete();

Итак, у меня есть родитель с несколькими последовательными детьми, и я хочу обновить этого родителя, чтобы у него не было детей.Когда я выполняю обновление без дочерних элементов этого родителя, я ожидаю, что в моей таблице SequencedChild будут удалены записи с идентификатором родителя.Но по какой-то причине NHibernate пытается обновить ParentId этих записей со значением null - что не удается, поскольку ParentId не равно нулю. РЕДАКТИРОВАТЬ: Я также ожидаю, что объект Child не затронут (который ведет себя правильно).

Я посмотрел на несколько вопросов, и все они предлагают использование обратного, но яЯ уже делаю это.Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 03 декабря 2010

Так что мне удалось найти решение, которое, как оказалось, имело несколько шагов:

  1. Как указал Джеймс в комментарии, ParentId / ChildId должны быть ссылками Parent / Child, а не только идентификаторами (+1для этого)
  2. SequencedChild должна иметь явную карту, в которой для каскада не задано значение
  3. При выполнении обновления не перезаписывайте список SequencedChild.Сначала очистите его, затем добавьте новые элементы.(Или просто очистите, если вы не заменяете элементы)
  4. В вызове Inverse() нет необходимости
  5. Поле ParentId в таблице базы данных должно иметь значение null, поскольку nHibernate настаивает на его обновлении доноль, прежде чем он удаляет его.(если кто-нибудь знает способ обойти это, оставьте комментарий)
1 голос
/ 03 декабря 2010

Попробуйте изменить каскад на Cascade.AllDeleteOrphan (), чтобы удалить потерянные дочерние записи в таблице SequencedChild.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...