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

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

有帮助吗?

解决方案

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

沿session.delete(“来自对象”);

其他提示

我正在使用SchemaExport类,并在每个测试之前重新创建架构。这几乎像删除数据库,但它只是丢弃和重新创建表。我假设从每个表中删除所有数据都没有更快,然后它甚至可以慢。

我们的单位测试通常在内存中的SQLite上运行,这非常快。只要连接打开,此数据库就存在,因此每个测试都会重新创建整个数据库。通过更改构建配置,我们正在切换到SQLServer。

我没有声明这是更快的,但是你可以为每个映射类做这样的事情:

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

这个(单独)将在至少2例中工作 not

    当应用程序启动时,存在数据库中必须在数据库中的数据时。
  1. 当您有一个identity属性未保存的值为“任何”的类型时。

替代方案具有初始DB状态的备份并在启动测试时恢复它(这可以复杂,取决于DB)

重新创建数据库是一个不错的选择,特别是对于单元测试。如果创建脚本太慢,您可以拍摄数据库,并使用它将DB恢复到每个测试前的初始状态。

替代方案是编写一个脚本,将丢弃数据库中的所有外部键,然后删除/截断所有表。然而,这不会重置任何自动化的ID或序列。这似乎并不像优雅的解决方案,绝对更耗时。 在任何情况下,这不是通过ORM完成的,而不仅仅是nhibernate。

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

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

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

hth

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top