3

是否可以使用 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 秒

我认为没有必要用更多的测试来测试。

4

6 回答 6

3

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

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

于 2010-07-08T07:34:19.220 回答
2

我并不是说这会更快,但是您可以为每个映射类执行以下操作:

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

这(单独)至少在两种情况下不起作用

  1. 当应用程序启动时数据库中必须存在数据时。
  2. 当您有一个身份属性的未保存值是“任何”的类型时。
于 2010-07-08T12:33:10.787 回答
2

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

类似于 session.Delete("from object");

于 2010-07-09T15:39:30.780 回答
1

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

于 2010-07-08T13:58:41.017 回答
0

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

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

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

于 2010-07-08T07:35:34.450 回答
0

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

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

高温高压

于 2010-07-09T06:22:48.997 回答