在NHibernate中,如何删除关联集的所有元素?

时间:2013-12-21 15:12:19

标签: c# nhibernate

假设我有一个名为Parent的类,在我的hbm.xml中有一对一对的Child类。我想尽可能有效地删除给定父母的所有孩子。这就是我现在正在做的事情:

foreach (var child in parent1.Children)
    session.Delete(child);
parent1.Children.Clear();

这导致3个以上不同的SQL语句:一个获取子实体的SELECT,后跟一个UPDATE,它根据父外键将所有子项中的外键设置为NULL,然后逐个多个DELETE语句

我希望看到的是一个DELETE,它根据父外键删除所有子节点。是否有NHibernate方法来做到这一点?或者我是否需要咬紧牙关并发出原始SQL语句?

1 个答案:

答案 0 :(得分:3)

NHibernate引入了一个非常酷的功能:13.3. DML-style operations

这支持两个NHibernate / SQL功能:

  1. 映射模型之上使用HQL(我们正在使用我们的Entity / POCO模型)
  2. 直接在服务器上执行WRITE操作(无数据下载到应用服务器)
  3. 从上述文档中调整示例:

    ISession session = sessionFactory.OpenSession();
    ITransaction tx = session.BeginTransaction();
    
    String hqlDelete = "delete Children c where c.ParentId = :parentId";
    
    int deletedEntities = s.CreateQuery( hqlDelete )
            .SetString( "parentId", parentId )
            .ExecuteUpdate();
    tx.Commit();
    session.Close();
    

    好读:Ayende: NHibernate – Executable DML