Как удалить файл LocalDB после использования — Не просто удалить DB — удалить файлы MDF и LDF

#c# #entity-framework #localdb

#c# #entity-framework #localdb

Вопрос:

Я создаю временный файл LocalDB с помощью EF через

 Database.SetInitializer(new DropCreateDatabaseAlways<SomeDbContext>());
 

Я использую его для хранения данных вместо списка, потому что их, ну, очень много…

Это временная база данных, которую мне нужно очистить и удалить после завершения процесса. Если бы он всегда запускался в одном и том же каталоге, было бы нетрудно позволить ему создавать / перезаписывать каждый раз и просто оставлять 2 файла… но процесс создает папки для того, что обрабатывается, и они остаются позади, и они могут стать довольно большими.

Я пытался:

 ctx.Database.Delete();
 

который работает для удаления базы данных, но я также хочу удалить файлы .mdf и .ldf…

поэтому, когда я запускаю (вне блока using)

         if (File.Exists(dbFilePath))
        { 
            File.Delete(dbFilePath); 
        }
 

Я получаю сообщение об ошибке:

Процесс не может получить доступ к файлу ‘C:pathSomeDB.mdf — потому что он используется другим процессом.

поэтому я попробовал другой вариант:

 ctx.Database.ExecuteSqlCommand(string.Format(@"ALTER DATABASE [{0}] SET OFFLINE WITH ROLLBACK IMMEDIATE", dbFilePath));
 

Ошибка:

Оператор ALTER DATABASE не допускается в транзакции с несколькими операторами.

Итак, я ищу способ закрыть все соединения, чтобы иметь возможность удалять файлы MDF и LDF.

Комментарии:

1. Возможно, вы захотите попробовать вызвать Dispose() контекст вашей базы данных -> ( social.msdn.microsoft.com/Forums/sqlserver/en-US /… ). Я пытался найти эти «особые случаи» там, где это необходимо, но не смог найти ничего конкретного. В худшем случае это ничего не изменит, и вы просто удалите его из своего кода.

2. Я попробовал это, получил сообщение об ошибке, процесс не может получить доступ к файлу C:pathSomeDB.mdf — потому что он используется другим процессом.

Ответ №1:

Что ж, оказывается, я не опубликовал достаточно кода, чтобы кто-то увидел проблему…

Мой код на самом деле имел:

 ctx.Database.Delete();
ctx.SaveChanges();
 

После еще некоторых поисков, по-видимому, SaveChanges() сохраняет соединение открытым.
https://docs.microsoft.com/en-us/previous-versions/bb738582 (v = против 90)?перенаправлено с = MSDN

Вызов любого из следующих методов открывает соединение:

Сохранить изменения или обновить в ObjectContext.

FirstOrDefault или First on ObjectQuery.

Нагрузка на EntityCollection.

Нагрузка на EntityReference.

В любом случае, также кажется, что мне даже не нужна проверка наличия файлов, чтобы вручную удалить их. Кажется, что после удаления базы данных и продолжения обработки / завершения / существования программы … в какой-то момент.. слишком устал, чтобы точно проверить, когда, что он также удаляет эти файлы.