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

C# 在NHibernate中,如何删除关联集的所有元素?,c#,nhibernate,C#,Nhibernate,假设我有一个名为Parent的类,在我的hbm.xml中有一个一对多的子类集合。我希望尽可能高效地删除给定父母的所有子女。这就是我现在正在做的: foreach (var child in parent1.Children) session.Delete(child); parent1.Children.Clear(); 这将导致3+个不同的SQL语句:一个SELECT语句获取子实体,然后是一个更新,该更新基于父外键将所有子实体中的外键设置为NULL,然后是多个DELETE语句,一个接

假设我有一个名为Parent的类,在我的hbm.xml中有一个一对多的子类集合。我希望尽可能高效地删除给定父母的所有子女。这就是我现在正在做的:

foreach (var child in parent1.Children)
    session.Delete(child);
parent1.Children.Clear();
这将导致3+个不同的SQL语句:一个SELECT语句获取子实体,然后是一个更新,该更新基于父外键将所有子实体中的外键设置为NULL,然后是多个DELETE语句,一个接一个


我希望看到的是一个删除,根据其父外键删除所有子项。有没有办法做到这一点?还是我需要咬紧牙关发布原始SQL语句?

NHibernate引入了一个非常酷的功能:

这同时支持两个NHibernate/SQL功能:

  • 在映射的模型上使用HQL(我们正在使用实体/POCO模型)
  • 直接在服务器上执行写操作(无数据下载到app server)
  • 调整上述文档中的示例:

    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();
    

    读起来不错:

    子实体没有父属性,它也没有映射到hbm.xml中。关联仅在父级中定义。我可以从父实体的角度进行删除,还是也必须映射反向多对一关联?我已经讨论过很多次了,所以我几乎可以肯定,我们应该映射子实体上的ParentId。第一。。。它在儿童桌上,因此它本质上属于儿童。第二,这带来了很多好处,例如DML;)。我们仍然可以减少写入操作(例如,使父对象仅为只读
    insert/update=“false”
    ),我们可以使
    ParentId
    属性具有受保护的setter。。。另一方面,我们确实获得了很多自由(我们现在也可以做子查询)