我有一个问题,我的应用通过EF连接到数据库时,这些连接会在我不希望它们存在的情况下保持打开状态。我正在为体育赛事创建计时系统,并动态创建新数据库,复制现有的DB文件并使用根据需要构建的正确文件名的连接字符串进行附加。
一种创建新文件的方法是基于现有事件,即复制然后清除大量数据。如果我在加载现有事件时尝试执行此操作,则无法复制该文件,因为SQL Server已将其锁定,并且我不能显式分离它,因为SQL Server声称它正在使用中。当我查看sys.sysprocesses的内容时,我发现EF仍然维护着“AWAITING COMMAND”的连接,尽管我将所有内容都封装在using()结构中,并使用IDbConnectionInterceptor来确认我的连接已被处理。
我已将示例简化为:
在
目前,我能想到的唯一释放文件的方法是找到并杀死sqlservr进程,并在文件操作后重新启动它。这似乎既沉重又危险。有人能建议更礼貌的选项吗?
一种创建新文件的方法是基于现有事件,即复制然后清除大量数据。如果我在加载现有事件时尝试执行此操作,则无法复制该文件,因为SQL Server已将其锁定,并且我不能显式分离它,因为SQL Server声称它正在使用中。当我查看sys.sysprocesses的内容时,我发现EF仍然维护着“AWAITING COMMAND”的连接,尽管我将所有内容都封装在using()结构中,并使用IDbConnectionInterceptor来确认我的连接已被处理。
我已将示例简化为:
using (SportsTimerEntities ctx = new SportsTimerEntities("metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlClient;provider connection string=\"Data Source=(LocalDB)\\v11.0;AttachDbFilename=C:\\Work\\SportsTimer\\Events\\559eae6a-9974-4463-8546-00824b4aad23.mdf;Integrated Security=True;MultipleActiveResultSets=True;Connect Timeout=30;Application Name=EntityFramework\""))
{
dbDevices = ctx.Devices.ToList();
}
在
using()
块之前没有连接,在块退出后,连接仍然存在。尽管IDbConnectionInterceptor确认已调用Dispose()
。目前,我能想到的唯一释放文件的方法是找到并杀死sqlservr进程,并在文件操作后重新启动它。这似乎既沉重又危险。有人能建议更礼貌的选项吗?