如何在使用后删除 LocalDB 文件 - 不仅仅是删除 DB - 删除 MDF 和 LDF 文件

时间:2021-02-05 21:33:57

标签: c# entity-framework localdb

我正在通过 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 文件。

1 个答案:

答案 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。

无论如何,我什至不需要检查文件来手动删除它们。似乎在数据库被删除并且处理继续/完成/存在程序之后......在某些时候......太累了,无法准确检查何时,它也会删除这些文件。

相关问题