如何使用nhibernate删除所有数据库数据?
-
12-09-2020 - |
题
是否可以使用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秒
我认为没有必要使用更多的测试测试。
解决方案
沿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 :
-
当应用程序启动时,存在数据库中必须在数据库中的数据时。
- 当您有一个identity属性未保存的值为“任何”的类型时。
替代方案具有初始DB状态的备份并在启动测试时恢复它(这可以复杂,取决于DB)
重新创建数据库是一个不错的选择,特别是对于单元测试。如果创建脚本太慢,您可以拍摄数据库,并使用它将DB恢复到每个测试前的初始状态。
替代方案是编写一个脚本,将丢弃数据库中的所有外部键,然后删除/截断所有表。然而,这不会重置任何自动化的ID或序列。这似乎并不像优雅的解决方案,绝对更耗时。 在任何情况下,这不是通过ORM完成的,而不仅仅是nhibernate。
为什么您拒绝重新创建选项?您的要求是什么?架构太复杂了吗?别人是否设计了数据库?你想避免文件碎片吗?
另一个解决方案可能是创建擦除数据的存储过程。在测试设置或实例化方法首先运行存储的过程。
然而,我不确定这是否比任何其他方法更快,因为我们不知道数据库的大小和可能被删除的行数。此外,我不建议将此存储过程部署到直播服务器以获取安全目的!
hth