【发布时间】:2019-06-21 18:31:08
【问题描述】:
问题: 我创建了一个随机名称的 mdf 文件的副本。 我将该名称注入到 EF6 DbContext 使用的连接字符串中。 它打开得很好,我运行查询等,然后我处理上下文。
此时,如果我尝试从文件系统中删除临时 mdf 文件,我将无法删除它;我收到“文件正在被另一个进程使用”错误。
有谁知道在连接关闭时是否可以强制连接解除对 mdf 文件的锁定? 或者当 SqlExpress 引擎释放 localdb 文件锁时?
我试过用这个:
master.ExecuteCommand(@"ALTER DATABASE [{0}] SET OFFLINE WITH ROLLBACK IMMEDIATE", db);
master.ExecuteCommand(@"exec sp_detach_db '{0}'", db);
... 从这里: How to detach a LocalDB (SQL Server Express) file in code ...但它对我不起作用,因为我需要这个:
MultipleActiveResultSets=True
在我的连接字符串中,因此不能通过启用 MultipleActiveResultSets 的连接发出 ALTER DATABASE。
谢谢, 克里斯
背景(因为我知道有人会问):
我已经为我们的集成测试创建了一个框架,其中每个测试都会获取本地数据库的副本。这很好用,所有测试都可以并行运行 - 特别是如果所有 DB 的临时文件夹都是 RAMDisk 文件夹,它的速度非常快。不幸的是,如果我在所有测试运行之后(或在下一个测试开始之前)清理所有数据库,我正在推动 RAMDisk 上的空间限制,所以我希望在每个测试完成后删除每个数据库。看起来只要测试引擎/sqlexpress 引擎正在运行,文件就会保持锁定状态。当它结束时,锁被解除。
【问题讨论】:
-
LocalDB是 SQL Server Express 的一个版本,它在您的应用程序启动时启动(独立或在 Visual Studio 中)并在您的应用程序停止后终止(通常它“徘徊”一段时间并且仅在几分钟后完全终止 - 为了避免在一分钟左右再次启动应用程序时再次启动)。您还可以使用 SqlLocalDB 实用程序手动停止实例 -
但我连接到许多不同的本地数据库并将它们的文件锁定在一个应用程序运行中。您是说一旦 SQLExpress 创建了这些锁,就无法在不结束整个进程树的情况下释放这些锁?
-
正如我所说:如果您想/需要使用
SqlLocalDB实用程序,您可以手动终止实例 .... -
你也可以从 yoir 测试代码中使用这个库:github.com/martincostello/sqllocaldb
标签: entity-framework integration-testing localdb