C# 如何使用打开的连接删除生成的mdf文件?

C# 如何使用打开的连接删除生成的mdf文件?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我已使用以下代码创建了一个数据库: public static void CreateDatabase(string databasePath) { AppDomain.CurrentDomain.SetData("DataDirectory", databasePath); using (var connection = new System.Data.SqlClient.SqlConnection(@"Data Source=(LocalDB)\MSSQLL

我已使用以下代码创建了一个数据库:

public static void CreateDatabase(string databasePath)
{
        AppDomain.CurrentDomain.SetData("DataDirectory", databasePath);

        using (var connection = new System.Data.SqlClient.SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=master; Integrated Security=true;;"))
        {
            connection.Open();

            using (var command = connection.CreateCommand())
            {
                command.CommandText =
                    String.Format("CREATE DATABASE {0} ON PRIMARY (NAME={0}, FILENAME='{1}')", "CoolDatabase", databasePath + @"\database.mdf");
                command.ExecuteNonQuery();

                command.CommandText =
                    String.Format("EXEC sp_detach_db '{0}', 'true'", "CotanDB");
                command.ExecuteNonQuery();
            }

            connection.Close();
        }
}
这为我的单元测试创建了一个很好的工作
.mdf
文件。但是,在对它运行所有测试之后,我想再次删除它,这样它就不会占用空间

我试过这个:

    public static void DestroyDatabase(string databasePath)
    {
        if (File.Exists(databasePath + @"\database.mdf"))
        {
            File.Delete(databasePath + @"\database.mdf");
        }

        if (File.Exists(databasePath + @"\database_log.ldf"))
        {
            File.Delete(databasePath + @"\database_log.ldf");
        }
    }
但这是一个错误

进程无法访问文件“数据库路径\数据库.mdf” 因为它正被另一个进程使用

因此,我尝试关闭与数据库的所有连接,以便删除该文件。但是,这不起作用:

var server = new Server();
server.KillDatabase(databasePath + @"\database.mdf");
哪个扔

无法连接到服务器

如何销毁本地数据库文件

编辑:我尝试了注释中答案中的代码:

 using (var connection = new System.Data.SqlClient.SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=master; Integrated Security=true;;"))
        {
            connection.Open();

            using (var command = connection.CreateCommand())
            {
                command.CommandText =
                    String.Format("USE master");
                command.ExecuteNonQuery();

                command.CommandText =
                    String.Format("ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE", "CotanDB");
                command.ExecuteNonQuery();

                command.CommandText =
                    String.Format("DROP DATABASE {0}", "CoolDatabase");
                command.ExecuteNonQuery();
            }

            connection.Close();
        }
后跟相同的文件。删除代码。但这会引发:

用户没有更改数据库“CoolDatabase”的权限 数据库不存在,或者数据库未处于允许的状态 访问检查

我自己想出来的。如果调用SqlConnection.ClearPool(connection),那么mdf文件的所有连接都将被删除,之后您可以轻松地删除它

回过头来看,这是一个可怕的解决方案,应该避免,因为这种构造意味着您的单元测试现在依赖于外部数据库。祝您在Azure管道中运行此功能时好运

如果您有此选项,请在内存数据库中使用EntityFramework:

将其脱机,然后删除=>