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:
将其脱机,然后删除=>