假设我有一个名为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语句?
答案 0 :(得分:3)
NHibernate引入了一个非常酷的功能:13.3. DML-style operations。
这支持两个NHibernate / SQL功能:
从上述文档中调整示例:
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();