处置DBContext对象后如何关闭数据库连接?

时间:2018-10-26 15:41:09

标签: c# sql-server entity-framework dbcontext mdf

我正在编写一个使用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锁。

0 个答案:

没有答案