2010-02-25 3 views
2

Я работаю над проектом с NHibernate, что классы, подобные следующим:Nhibernate - как удалить детей?

public class Parent { 
    public IList Children {get;set;} 
    // ... 
} 

public class Child { 
    // ... 
} 

У меня есть свойство детей установить каскад все/удалить сирота. Поскольку я использую совокупный шаблон, и экземпляры класса Child будут упоминаться только в контексте родителя, у меня нет ChildRepository, чтобы удалить детей напрямую - только ParentRepository. Однако, когда я извлекаю объект Parent и вызываю Parent.Children.Clear(), дети из базы данных никогда не удаляются. Как я могу это достичь?

ответ

3

Удаление дочерних объектов легко: просто удалите их из коллекции и затем сохраните родительский объект. Коллекция должна быть сопоставлена ​​со всеми исключениями-сиротами.

parent.Children.Clear(); 
session.Save(parent); 

// or 
parent.Children.RemoveAt(0); 
session.Save(parent); 

Вы можете сделать это без вызовов Save(), если только ваш FlushMode не был.

session.BeginTransaction(); 
parent.Children.Clear(); 
session.Transaction.Commit(); 

Использование @ UnitOfWork Криса abstractionm это может выглядеть следующим образом:

using (var uow = new UnitOfWork()) { 
    parent.Children.Clear(); 
} 
+0

Проблема в том, что я использую шаблон репозитория и не имеют прямого доступа к объекту сеанса. Я обертываю все внутри экземпляра IUnitOfWork, который абстрагирует объект сеанса + транзакцию и вызывает Commit() на единице работы в конце, который стажер совершает транзакцию NHibernate. – Chris

+1

Я думаю, мне просто нужно добавить метод Save в мои базовые классы репозитория. Видимо, несмотря на то, что я не нуждался в этом до сих пор, это довольно зияющая дыра в моей структуре. – Chris

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