关闭MSSQL服务器上的数据库连接
本文关键字:数据库连接 服务器 MSSQL 关闭 | 更新日期: 2023-09-27 17:54:33
我正在编写集成测试来验证存储库中的行为。我遇到的问题是,我想为每个测试从一个干净的数据库开始。我设法通过如下方式编写安装程序:
[SetUp]
public void SetUp()
{
_applicationContext = new TestApplicationContext();
_applicationContext.Database.Connection.Close();
_applicationContext.Database.Delete();
_applicationContext.Database.Create();
_tenantRepository = new TenantRepository(_applicationContext);
_userRepository = new UserRepository(_applicationContext);
}
TestApplicationContext
设置数据库名称为TestDatabase
。
在我想要检查实际数据库的测试结果之前,这工作得很好。然后,我从MSSQL服务器连接到相同的数据库,它不会关闭,直到我:
- 关闭MSSQL服务器
- 使用close all connections选项删除数据库
我发现唯一的方法是通过SQL命令。也许是因为我对MSSQL知之甚少,但我有点希望有一个"关闭连接"按钮/选项。
如何关闭从MSSQL服务器到数据库的连接?或者,有没有一种方法,我可以从c#编程做到这一点?
更新:也许我没有很清楚。但是,在我打开MSSQL并查看表的内容后,测试设置失败了。这是因为MSSQL还创建了一个到TestDatabase的连接,而我的集成测试无法关闭那个连接。所以我正在寻找一个解决方案,允许我关闭我从MSSQL服务器创建的连接。
如果不是删除并重新创建整个数据库,而是删除并重新创建所选表(或所有表),则可以解决连接问题。
你可以创建一个小脚本,它将以一种你不需要硬编码表名的方式为你做:http://www.apexure.com/blog/2010/07/29/delete-all-tables-in-sql-server-database/
或者,Julia Lerman在她的书"编程实体框架:代码优先"中以更成熟的形式提到了这种方法,作为自定义数据库初始化器:
除了编写自己的自定义初始化器之外,您还可以找到别人创建的初始化器。其中一个例子是在EFCodeFirst中可用。CreateTablesOnly NuGet包。这初始化器将允许您删除和创建表现有的数据库,而不是删除和创建实际的数据库本身。如果你的目标是的托管数据库,您无权删除或创建整个数据库。
您正在将连接释放回连接池,而不是实际上关闭它。不是为每个测试创建/删除数据库,而是在设置中开始新事务,在清理中回滚。这样就不会有任何更改提交到您的数据库,并且您的测试将始终从一个干净的状态开始。
另外,因为您是针对实时数据库进行测试,所以我不会将您的测试称为"单元"测试。单元测试没有任何外部依赖。
可靠地获得数据库独占锁的唯一方法是使用SINGLE_USER WITH ROLLBACK IMMEDIATE
技术。我建议您创建一个状态为空的数据库快照,并每次都恢复到该快照。这样会快得多。