C# 在NHibernate中,如何删除关联集的所有元素?
假设我有一个名为Parent的类,在我的hbm.xml中有一个一对多的子类集合。我希望尽可能高效地删除给定父母的所有子女。这就是我现在正在做的: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语句,一个接
foreach (var child in parent1.Children)
session.Delete(child);
parent1.Children.Clear();
这将导致3+个不同的SQL语句:一个SELECT语句获取子实体,然后是一个更新,该更新基于父外键将所有子实体中的外键设置为NULL,然后是多个DELETE语句,一个接一个
我希望看到的是一个删除,根据其父外键删除所有子项。有没有办法做到这一点?还是我需要咬紧牙关发布原始SQL语句?NHibernate引入了一个非常酷的功能: 这同时支持两个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();
读起来不错:子实体没有父属性,它也没有映射到hbm.xml中。关联仅在父级中定义。我可以从父实体的角度进行删除,还是也必须映射反向多对一关联?我已经讨论过很多次了,所以我几乎可以肯定,我们应该映射子实体上的ParentId。第一。。。它在儿童桌上,因此它本质上属于儿童。第二,这带来了很多好处,例如DML;)。我们仍然可以减少写入操作(例如,使父对象仅为只读
insert/update=“false”
),我们可以使ParentId
属性具有受保护的setter。。。另一方面,我们确实获得了很多自由(我们现在也可以做子查询)