我正在通过 EF 创建一个临时的 localDB 文件
Database.SetInitializer(new DropCreateDatabaseAlways<SomeDbContext>());
我用它来存储数据而不是一个列表,因为有很多...
这是一个临时数据库,我需要在进程完成后清理和删除它。如果它总是在同一个目录中运行,那么让它每次创建/覆盖并只留下 2 个文件并没有什么大不了的......可以变得相当大。
我试过了:
ctx.Database.Delete();
用于删除数据库,但我也想删除 .mdf 和 .ldf 文件...
所以当我运行时(在 using 块之外)
if (File.Exists(dbFilePath))
{
File.Delete(dbFilePath);
}
我收到一个错误:
<块引用>进程无法访问文件“C:\path\SomeDB.mdf”,因为它正被另一个进程使用。
所以我尝试了另一种选择:
ctx.Database.ExecuteSqlCommand(string.Format(@"ALTER DATABASE [{0}] SET OFFLINE WITH ROLLBACK IMMEDIATE", dbFilePath));
错误:
<块引用>在多语句事务中不允许使用 ALTER DATABASE 语句。
因此,我正在寻找一种关闭所有连接的方法,以便能够删除 MDF 和 LDF 文件。
答案 0 :(得分:0)
好吧,事实证明我没有发布足够的代码让别人看到问题......
我的代码实际上有:
ctx.Database.Delete();
ctx.SaveChanges();
经过更多的挖掘,显然 SaveChanges() 保持连接打开。 https://docs.microsoft.com/en-us/previous-versions/bb738582(v=vs.90)?redirectedfrom=MSDN
<块引用>调用以下任一方法打开连接:
SaveChanges 或在 ObjectContext 上刷新。
FirstOrDefault,或 First on ObjectQuery。
加载 EntityCollection。
加载 EntityReference。
无论如何,我什至不需要检查文件来手动删除它们。似乎在数据库被删除并且处理继续/完成/存在程序之后......在某些时候......太累了,无法准确检查何时,它也会删除这些文件。