SQL management studio 中可见的 LocalDB 连接
LocalDB connections visible in SQL management studio
在我的单元测试中,我使用的是 SQL Server LocalDB 数据库。您可能会吹毛求疵,并说因为这个事实它不是单元测试而是集成测试,您是对的,但关键是我正在使用 MSTest 框架来 运行 这些测试。每个测试都在复制一个现有的数据库,然后 运行 在这个数据库上进行他们的一个测试。
private NAMETestSystem([CallerMemberName] string testCase = null)
{
this.destinationDirectory = Path.Combine(Directory.GetCurrentDirectory(), testCase ?? "Undefined_" + Guid.NewGuid().ToString("N"));
var connectionString = $"Data Source=(LocalDB)\MSSQLLocalDB; Integrated Security = True; AttachDbFilename ={Path.Combine(this.destinationDirectory, "NAMEIntegrationTest.mdf")}";
var entityFrameworkData = $"metadata=res://*/NAME.csdl|res://*/NAME.ssdl|res://*/NAME.msl;provider=System.Data.SqlClient;provider connection string=\"{connectionString}\"";
// [...]
Copy(SourceDirectory, this.destinationDirectory);
我的 "problem" 是这些副本中的每一个都会在我的 SQL 服务器管理工作室中弹出。所有 100 多个或他们。我在那里不需要他们。它们不存在了。更糟糕的是,你不能批量分离...我必须按 Del+Enter 大约 150 次才能清除 window 起来。
有没有办法不让我的临时本地数据库实例出现在我的SQL服务器管理工作室中?
也许有特殊的关闭或处理方式,我可以在连接字符串中设置一些东西?或者也许有一种方法可以在管理工作室中同时分离所有这些?
最后,我所做的以及目前运行良好的是:
public void Dispose()
{
// disposing other stuff
// sql db
if (Directory.Exists(this.destinationDirectory))
{
DetachDatabase(this.connectionString);
Directory.Delete(this.destinationDirectory, true);
}
}
public static void DetachDatabase(string connectionString)
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
var sql = "DECLARE @dbName NVARCHAR(260) = QUOTENAME(DB_NAME());\n" +
"EXEC('ALTER DATABASE ' + @dbName + ' SET OFFLINE WITH ROLLBACK IMMEDIATE;');\n" +
"EXEC('exec sp_detach_db ' + @dbName + ';');";
command.CommandText = sql;
command.ExecuteNonQuery();
}
}
}
可能不是最漂亮的解决方案,但至少它在测试数量(和数据库数量)增加的同时保持我的理智。
在我的单元测试中,我使用的是 SQL Server LocalDB 数据库。您可能会吹毛求疵,并说因为这个事实它不是单元测试而是集成测试,您是对的,但关键是我正在使用 MSTest 框架来 运行 这些测试。每个测试都在复制一个现有的数据库,然后 运行 在这个数据库上进行他们的一个测试。
private NAMETestSystem([CallerMemberName] string testCase = null)
{
this.destinationDirectory = Path.Combine(Directory.GetCurrentDirectory(), testCase ?? "Undefined_" + Guid.NewGuid().ToString("N"));
var connectionString = $"Data Source=(LocalDB)\MSSQLLocalDB; Integrated Security = True; AttachDbFilename ={Path.Combine(this.destinationDirectory, "NAMEIntegrationTest.mdf")}";
var entityFrameworkData = $"metadata=res://*/NAME.csdl|res://*/NAME.ssdl|res://*/NAME.msl;provider=System.Data.SqlClient;provider connection string=\"{connectionString}\"";
// [...]
Copy(SourceDirectory, this.destinationDirectory);
我的 "problem" 是这些副本中的每一个都会在我的 SQL 服务器管理工作室中弹出。所有 100 多个或他们。我在那里不需要他们。它们不存在了。更糟糕的是,你不能批量分离...我必须按 Del+Enter 大约 150 次才能清除 window 起来。
有没有办法不让我的临时本地数据库实例出现在我的SQL服务器管理工作室中?
也许有特殊的关闭或处理方式,我可以在连接字符串中设置一些东西?或者也许有一种方法可以在管理工作室中同时分离所有这些?
最后,我所做的以及目前运行良好的是:
public void Dispose()
{
// disposing other stuff
// sql db
if (Directory.Exists(this.destinationDirectory))
{
DetachDatabase(this.connectionString);
Directory.Delete(this.destinationDirectory, true);
}
}
public static void DetachDatabase(string connectionString)
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
var sql = "DECLARE @dbName NVARCHAR(260) = QUOTENAME(DB_NAME());\n" +
"EXEC('ALTER DATABASE ' + @dbName + ' SET OFFLINE WITH ROLLBACK IMMEDIATE;');\n" +
"EXEC('exec sp_detach_db ' + @dbName + ';');";
command.CommandText = sql;
command.ExecuteNonQuery();
}
}
}
可能不是最漂亮的解决方案,但至少它在测试数量(和数据库数量)增加的同时保持我的理智。