2010-12-03 3 views
1

У меня возникла проблема с быстрым откатом каскада nhibernate. Я уверен, что я делаю что-то неправильно, потому что он не работает.Проблема с удалением каскада с 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 этих записей с нулевым значением - что не получается, поскольку ParentId не является нулевым. EDIT: Я также ожидаю, что объект Child не затронут (который ведет себя правильно).

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

ответ

3

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

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

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

+0

Проблема в том, что сироты не могут быть созданы, так как ParentId NotNull и NHibernate пытается установить их в null. – 2010-12-03 01:14:15

+0

В вашем классе SequencedChild действительно есть ParentId/ChildId, а не ссылки на родителя/ребенка? Если это так, Inverse() не будет работать, поскольку вы сообщаете NHibernate, что Child управляет отношением «один ко многим», но у ребенка нет обратной ссылки на его родителя. NHibernate не может сказать, что ParentId (int) является обратной ссылкой. – 2010-12-03 01:39:49

Смежные вопросы