如何用NHibernate删除所有数据库数据?

时间:2010-07-08 07:26:35

标签: unit-testing nhibernate database-testing

是否可以使用NHibernate删除数据库中的所有数据。我想在开始每个单元测试之前这样做。目前我放弃了我的数据库并再次创建它,但这对我来说是不可接受的解决方案。

=============================================== ===========

好的,结果如下。我在数据库(Postgre)上测试它。我将测试CreateSchema(1),DanP解决方案(2)和apollodude217解决方案(3)。我用每种方法运行测试5次并取平均时间。

第1轮 - 第10轮测试 (1) - ~26秒
(2) - 9,0秒
(3) - 9,3秒

第2轮--100次测试
(1) - 来吧,我不会在我的机器上那样做 (2) - 12,6秒
(3) - 18,6秒

我认为没有必要进行更多测试。

6 个答案:

答案 0 :(得分:3)

我正在使用SchemaExport类并在每次测试之前重新创建架构。这几乎就像删除数据库一样,但它只是删除并重新创建表。我假设删除每个表中的所有数据并不比这更快,它甚至可能更慢。

我们的单元测试通常在内存中运行Sqlite,这非常快。只有连接打开时,此数据库才存在,因此将为每个测试重新创建整个数据库。我们通过更改构建配置切换到Sqlserver。

答案 1 :(得分:2)

我并不认为这更快,但您可以为每个映射类执行类似的操作:

// untested
var entities = MySession.CreateCriteria(typeof(MappedClass)).List<MappedClass>();
foreach(var entity in entities)
    MySession.Delete(entity);  // please optimize

这个(单独)将至少在两种情况下工作:

  1. 当应用启动时,数据库中必须存在数据。
  2. 如果您的身份属性的unsaved-value为“any”。

答案 2 :(得分:2)

就个人而言,我使用存储过程来执行此操作,但可以使用可执行文件HQL(有关详细信息,请参阅此帖子:http://fabiomaulo.blogspot.com/2009/05/nh21-executable-hql.html

session of Session.Delete(“from object”);

答案 3 :(得分:1)

一个很好的选择是备份初始DB状态并在开始测试时恢复它(这可能很复杂或不复杂,具体取决于数据库)

答案 4 :(得分:0)

重新创建数据库是一个不错的选择,尤其是对于单元测试。如果创建脚本太慢,您可以备份数据库并使用它在每次测试之前将数据库恢复到初始状态。

另一种方法是编写一个脚本,它将删除数据库中的所有外键,然后删除/截断所有表。但是,这不会重置任何自动生成的ID或序列。这似乎不是一个优雅的解决方案,它肯定更耗时。 无论如何,这不是应该通过ORM完成的,而不仅仅是NHibernate。

为什么拒绝重新创建选项?你有什么要求?架构是否太复杂?有人设计数据库吗?你想避免文件碎片吗?

答案 5 :(得分:0)

另一种解决方案可能是创建擦除数据的存储过程。在您的测试设置或实例化方法中,首先运行存储过程。

但是我不确定这是否比任何其他方法更快,因为我们不知道数据库的大小和可能被删除的行数。另外,我不建议出于安全目的将此存储过程部署到实时服务器!

HTH