为了让我的集成测试保持独立,我删除了所有旧数据并在每次测试之前插入新的测试数据。有没有比简单地查询所有实体并一个一个删除它们更好的方法呢?
我考虑过编写一个运行“从表名中删除; ”的存储过程 对于要清除的每个表。这应该会快一些,但最好不要执行 SQL 查询或通过 NH 调用 SP。
我正在使用香草 NHibernate 和 Linq to NHibernate。我相信 Castle Active Record 有类似 Foo.DeleteAll() 的东西,但我不想在这个项目中使用 Active Record。
有任何想法吗?
谢谢/埃里克
更新:
自从提出并回答了这个问题以来,NHibernate 团队已经取得了进展。正如 Ayende 在这篇博文中解释的那样,您现在可以直接执行 DML 查询,而 NHibernate 不必获取任何实体。
要删除所有 Foo 对象,您可以这样做:
using (ISession session = ...)
using (ITransaction transaction = session.BeginTransaction())
{
session.CreateQuery("delete Foo f").ExecuteUpdate();
transaction.Commit();
}
此查询将生成以下 SQL:
delete from Foo
这比先获取实体然后删除它们要快得多。不过要小心,因为这样的查询不会影响 1 级缓存。