关闭MSSQL服务器中的数据库连接

时间:2013-01-20 18:22:04

标签: c# sql-server unit-testing

我正在编写集成测试来验证我的存储库中的行为。我遇到的问题是我想从每个测试的干净数据库开始。我设法通过编写SetUp来实现如下:

    [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服务器
  • 使用“关闭所有连接”选项删除数据库

我找到的唯一方法是通过SQL命令。也许是因为我对MSSQL的n00b知识,但我有点希望有一个“关闭连接”按钮/选项。

如何从MSSQL服务器关闭与数据库的连接? 或者,有没有办法可以通过C#以编程方式执行此操作?

更新:

也许我不太清楚。但是在打开MSSQL并查看表的内容后,测试SetUp失败了。这是因为MSSQL还创建了与TestDatabase的连接,并且我的集成测试无法关闭那个连接。所以我正在寻找一种解决方案,允许我关闭我从MSSQL服务器创建的连接。

3 个答案:

答案 0 :(得分:2)

您将连接释放回连接池,而不是实际关闭它。不是为每个测试创建/删除数据库,而是在清理中开始设置和回滚中的新事务。这样就不会对您的数据库进行任何更改,并且您的测试将始终从干净状态开始。

另外,因为您正在测试实时数据库,所以我不会调用您的测试" unit"试验。单元测试没有任何外部依赖性。

答案 1 :(得分:2)

您可以解决连接问题,而不是删除并重新创建整个数据库,只需删除并重新创建所选表(或所有表)。

您可以创建一个小脚本,以不需要对表名进行硬编码的方式为您完成: http://www.apexure.com/blog/2010/07/29/delete-all-tables-in-sql-server-database/

另外,Julia Lerman在她的“编程实体框架:代码优先”一书中以更成熟的形式提到了这种方法,并将其作为自定义数据库初始化程序加入:

  

除了编写自己的自定义初始值设定项外,您还可以找到   其他人创建的初始化程序。一个例子是   可在EFCodeFirst.CreateTablesOnly NuGet包中找到。这个   初始化程序将允许您删除并创建表中的表   现有数据库,而不是删除和创建实际   数据库本身。如果您要定位,则此功能特别有用   托管数据库,您无权删除或创建   整个数据库。

答案 2 :(得分:0)

可靠地获取数据库的独占锁定的唯一方法是使用SINGLE_USER WITH ROLLBACK IMMEDIATE技术。我建议您创建一个空状态的数据库快照,并每次还原到该快照。那会更快。