为了保持独立的集成测试,我删除所有旧数据并在每次测试前插入新的测试数据。有没有比单纯查询所有实体并逐个删除它们更好的方法?使用NHibernate删除表中所有行的最佳方法?
我曾考虑编写一个存储过程,该过程运行“从表中删除;”对于每个要清除的表。这应该快得多,但是如果不通过SQL查询或通过NH调用SP,将会很好。
我使用香草NHibernate和Linq到NHibernate。我相信Castle Active Record有类似Foo.DeleteAll()的功能,但我不想在此项目中使用Active Record。
任何想法?
感谢/埃里克
UPDATE:
因为这个问题被提出和回答,进展一直由NHibernate的团队做。正如Ayende在this blog post中解释的那样,您现在可以直接执行DML查询,而无需NHibernate获取任何实体。
要删除所有的Foo对象,你可以这样做:
using (ISession session = ...)
using (ITransaction transaction = session.BeginTransaction())
{
session.CreateQuery("delete Foo f").ExecuteUpdate();
transaction.Commit();
}
的查询方法生成的SQL语句:
delete from Foo
其中奥特是显著快于第一,然后取实体删除它们。但要小心,因为这样的查询不会影响1级缓存。
如果您使用的是SQL Server,执行`TRUNCATE TABLE foo;`会更有效,因为这是一个最小化日志操作。执行`DELETE FROM foo;`记录所有删除以进行恢复;在大型表上这需要大量的磁盘/时间。 – 2009-06-22 18:20:14
当涉及外键时,TRUNCATE TABLE几乎不可用。 – 2011-11-10 16:11:55