我遇到了同样的问题,一直在思考如何处理它。
有三种方法:
在完成(或在工作期间)与数据库交互后分离连接
我没有找到在LinqToSQL中关闭连接的方法,但实际上也不需要。只需执行以下代码:
var db = @"c:\blablabla\database1.mdf";
using (var master = new DataContext(@"Data Source=(LocalDB)\v11.0;Initial Catalog=master;Integrated Security=True"))
{
master.ExecuteCommand(@"ALTER DATABASE [{0}] SET OFFLINE WITH ROLLBACK IMMEDIATE", db);
master.ExecuteCommand(@"exec sp_detach_db '{0}'", db);
}
并确保在之后没有任何尝试查询db
的操作(否则它会再次被附加)。
在启动时分离
在连接到db
之前,分离很简单:
var db = @"c:\blablabla\database1.mdf";
using (var master = new DataContext(@"Data Source=(LocalDB)\v11.0;Initial Catalog=master;Integrated Security=True"))
master.ExecuteCommand(@"exec sp_detach_db '{0}'", db);
这个套装非常适合我的需求,因为我不在意启动应用程序的延迟(因为在这种情况下我将始终附加到db
),但它可以修复任何类型的
System.Data.SqlClient.SqlException (0x80131904):数据库'c:\blablabla\database1.mdf'已经存在。选择一个不同的数据库名称。
如果数据库文件被删除并且您尝试以编程方式创建它,则会出现此问题
// DataContext
if (!DatabaseExists())
CreateDatabase();
另一种方法
您还可以像这样运行命令行工具 sqllocaldb
:
var start = new ProcessStartInfo("sqllocaldb", "stop v11.0");
start.WindowStyle = ProcessWindowStyle.Hidden;
using (var stop = Process.Start(start))
stop.WaitForExit();
start.Arguments = "delete v11.0";
using (var delete = Process.Start(start))
delete.WaitForExit();
它将停止服务器并分离所有数据库。如果您有其他使用LocalDB的应用程序,则它们在下次尝试查询时将遇到附加延迟。
localdb
,也许那个工具有一个打开的连接? - florians