我正在编写一个使用Entity Framework的程序。它动态创建和删除/删除本地数据库。
我这样连接到数据库文件:
context = new MyDbContext($@"data source=(LocalDB)\MSSQLLocalDB;attachdbfilename='{path}';App=EntityFramework");
在数据库上完成一些工作后,我想通过处理DbContext对象来关闭它:
context.Dispose();
context = null;
直到现在它可以正常工作-在关闭数据库后再次连接到同一数据库时也是如此。
当我想删除数据库而不在同一程序实例中连接到数据库时,下面的代码运行没有错误。
using (SqlConnection connection = new SqlConnection(@"data source=(LocalDB)\MSSQLLocalDB;App=EntityFramework"))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = $@"EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'{logPath}';";
command.ExecuteNonQuery();
command.CommandText = $@"DROP DATABASE [{mdfPath}];";
command.ExecuteNonQuery();
}
connection.Close();
}
现在,我连接到数据库,然后断开连接。然后,我想删除/删除它,但出现以下异常(System.Data.SqlClient.SqlException):“无法删除数据库,因为它当前正在使用。”
因此,我认为处理DbContext不足以完全断开与数据库的连接... 我已经尝试从数据库中分离:
using (SqlConnection connection = new SqlConnection(@"data source=(LocalDB)\MSSQLLocalDB;App=EntityFramework"))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = $@"EXEC sp_detach_db '{mdfPath}'";
command.ExecuteNonQuery();
}
connection.Close();
}
但这也不起作用。
您知道完全关闭数据库连接该怎么做吗?
我正在编辑已关闭的问题,以为该(错误地)已关闭的问题提供答案。
您可以通过以下方法解决缠结的池连接,方法是在处置之前先将数据库上下文更改为master
。
command.CommandText = "USE master";
command.ExecuteNonQuery();
command.CommandText = "DROP DATABASE foo";
command.ExecuteNonQuery();
这样,在ADO.net连接池中徘徊的连接将不会在数据库上持有Shared
锁。