gpt4 book ai didi

c# - Entity Framework 无法删除数据库,正在使用的数据库

转载 作者:太空宇宙 更新时间:2023-11-03 16:18:04 25 4
gpt4 key购买 nike

我(和许多其他人一样)遇到了一个问题,即我无法让我的 NUnit 测试删除测试夹具的 [SetUp] 中的数据库。

我想要实现的目标

我想编写集成测试来测试我的代码并验证预期结果是否存储在数据库中(断言 CRUD 方法)。那,我希望能够实际显示 SqlServer 中的表并查看数据库中的结果。最后一部分似乎很难实现......

出了什么问题

我可以连续多次运行我的测试。每次都在 [SetUp] 中重新创建数据库,并且测试通过断言。一旦我想在 SqlServer 的实际数据库中检查我的结果,它就会付诸东流。从 SqlServer 打开连接后,[SetUp] 方法不允许删除数据库,因为它有打开的连接。

我尝试了什么

  • 数据库初始化器
  • ALTER database SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  • Pooling=false 添加到连接字符串

这些想法来自 thisthis所以发帖。

我有什么

[SetUp] 方法:

    [SetUp]
public void SetUp()
{
// TenantSeedInitializer extends the
// DropCreateDatabaseAlways<TenantApplicationTestContext> class

Database.SetInitializer(new TenantSeedInitializer());
_applicationContext = new TenantApplicationTestContext();
_applicationContext.Database.ExecuteSqlCommand("ALTER DATABASE " +
TenantApplicationTestContext.DatabaseName +
" SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
}

[TearDown] 方法:

    [TearDown]
public void TearDown()
{
SqlConnection.ClearAllPools();
}

还有一个非常直接的测试:

    [Test]
public void AddTenant()
{
// add a new tenant to the database and verify that there
// there is only one tenant present in the table
}

正如我所说,连续多次运行这个测试就像一个魅力,直到我尝试在 SqlServer 中打开表。

两种不同的(对我来说 Unresolved )错误场景

1) 要么我不允许查看表格,因为来自 visual studio 的连接仍然打开。

Database 'TestTenantDatabase' is already open and can only have one user at a time.

添加 SqlConnection.ClearAllPools(); 似乎无法解决这个问题。

2) 或者我被允许查看 SqlServer 中的表,然后我不再被允许从我的 [SetUp] fixture 中删除数据库。

Cannot drop database "TestTenantDatabase" because it is currently in use.

关闭 SqlServer 是我所知道的摆脱它的唯一方法。但后来我发现自己在白天很多 重新启动 SqlServer ......(关闭与数据库的连接的选项也有帮助,但我找不到它)。

谁能指导我解决这个问题?

最佳答案

这条消息:

Database 'TestTenantDatabase' is already open and can only have one user at a time.

发生这种情况是因为您已将数据库设置为单用户。通常你这样做会终止与数据库的其他连接,并使你的连接成为唯一可以访问它的连接。但是,如果您更改数据库上下文,某些其他应用程序(如 Visual Studio)可能会连接进来并成为单一用户,从而有效地将您拒之门外。

在你的安装夹具中试试这个:

use TestTenantDatabase;
alter database TestTenantDatabase set single_user with rollback immediate;
use master;
drop database TestTenantDatabase;

如果你在设置单用户时在数据库中,你将成为单用户。然后,如果您更改为 master 然后在同一批处理中删除数据库,它应该会击败任何试图连接到它的人。

另一种选择是设置离线,而不是单用户,但是,当您随后删除数据库时,它不会删除数据库的 .mdf 和 .ldf(以及任何 .ndf)文件,因此您在重新创建数据库时可能会遇到问题用于另一组测试的数据库。

如果在运行 single_user 时出现与死锁相关的错误,请将死锁优先级设​​置为高。如果您要重新使用连接,可以在断开后将其设置回正常状态。

关于c# - Entity Framework 无法删除数据库,正在使用的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15051185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com