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