Ваш текущий контекст должен иметь открытое соединение, чтобы иметь возможность удалить базу данных.Проблема в том, что могут быть другие открытые соединения, которые блокируют ваш инициализатор БД.Один очень хороший пример - открытие любой таблицы из вашей базы данных в студии управления.Другой возможной проблемой могут быть открытые соединения в пуле соединений вашего приложения.
В MS SQL этого можно избежать, например, переключив DB в режим SINGLE USER и принудительно закрыв все соединения и откат незавершенных транзакций:
ALTER DATABASE Tocrates SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Вы можете создать новый инициализатор, который сначала вызовет эту команду, а затем отбросит базу данных.Помните, что вы должны сами обрабатывать соединение с базой данных, потому что ALTER DATABASE
и DROP DATABASE
должны вызываться для одного и того же соединения.
Редактировать:
Вот вам пример использования шаблона Decorator.Вы можете изменить его и инициализировать внутренний инициализатор внутри конструктора вместо передачи его в качестве параметра.
public class ForceDeleteInitializer : IDatabaseInitializer<Context>
{
private readonly IDatabaseInitializer<Context> _initializer;
public ForceDeleteInitializer(IDatabaseInitializer<Context> innerInitializer)
{
_initializer = innerInitializer;
}
public void InitializeDatabase(Context context)
{
context.Database.SqlCommand("ALTER DATABASE Tocrates SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
_initializer.InitializeDatabase(context);
}
}