【问题标题】:Nhibernate - how to delete children?Nhibernate - 如何删除孩子?
【发布时间】:2010-02-25 16:25:32
【问题描述】:

我正在使用 NHibernate 开发一个类似于以下类的项目:

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

public class Child {
    // ...
}

我已将 Children 属性设置为级联所有/删除孤儿。由于我使用的是聚合模式,并且 Child 类的实例只会在 Parent 的上下文中被引用,所以我没有 ChildRepository 来直接删除孩子 - 只有 ParentRepository。但是,当我检索父对象并调用 Parent.Children.Clear() 时,永远不会删除数据库中的子对象。我怎样才能做到这一点?

【问题讨论】:

    标签: nhibernate domain-driven-design


    【解决方案1】:

    删除子实体就是这么简单 - 只需将它们从集合中删除,然后保存父实体。该集合应使用 all-delete-orphans 进行映射。

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

    您也可以在不调用 Save() 的情况下执行此操作,除非您的 FlushMode 为 Never。

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

    使用@Chris 的 UnitOfWork 抽象,这可能看起来像:

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

    【讨论】:

    • 问题在于我使用的是存储库模式并且我没有直接访问会话对象的权限。我将所有内容包装在一个 IUnitOfWork 实例中,该实例抽象了会话对象 + 事务,并在实习生提交 NHibernate 事务的最后对工作单元调用 Commit()。
    • 我想我只需要在我的存储库基类中添加一个 Save 方法。显然,尽管我直到现在才需要它,但它在我的框架中是一个相当大的漏洞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多