2016-08-01 74 views
0

我們正在使用EF 6,對於某些集成測試,我們希望完全刪除我們的數據庫,並使用數據庫上下文重新創建它。使用EntityFramework刪除並重新創建數據庫

我們嘗試獲取數據庫的專用權,但正在使用數據庫errror。這是我們嘗試過的:

private void CreateDatabase() 
    { 
     MyDbContext context = new MyDbContext(); 
     SqlConnection sqlConnection = context.Database.Connection as SqlConnection; 

     LockDb(sqlConnection); 
     context.Database.Delete(); 
     context.Database.CreateIfNotExists(); 
     UnLockDb(sqlConnection); 
     _context = context; 
    } 

    private void LockDb(SqlConnection connection) 
    { 
     const string cmdText = 
      "USE[master];" 
      + "IF exists(select * from sys.databases where name = 'MyDb')" 
      + "BEGIN" 
      + " ALTER DATABASE[MyDb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;" 
      + "END;"; 

     OpenConnection(connection); 
     ExecuteCommand(connection, cmdText); 
    } 

我們缺少什麼?

+0

您的測試是否並行運行? –

+0

他們可能,應該沒關係,甚至更強,如果他們是這樣應該防止他們刪除並重新創建數據庫一致 –

+0

嗯,我不是唯一有這個問題的人找到了答案[這裏(在棧上的課程)]( http://stackoverflow.com/questions/15051185/entity-framework-unable-to-delete-database-database-in-use?rq=1) –

回答

1

嗯,我不是唯一一個有這個問題找到了答案here (on stack ofcourse)

的伎倆是在一個SQL語句

private void DeleteDb(SqlConnection connection) 
    { 
     const string cmdText = 
      "USE[master];" 
      + "IF exists(select * from sys.databases where name = 'Tor')" 
      + "BEGIN" 
      + " ALTER DATABASE[Tor] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;" 
      + " DROP DATABASE [Tor];" 
      + "END;"; 

     OpenConnection(connection); 
     ExecuteCommand(connection, cmdText); 
    } 

UPDATE

刪除數據庫嘛即使上述不是防彈的。

現在只需使用:

private void CreateDatabase() 
    { 
     TorDbContext context = new TorDbContext(); 
     context.Database.Delete(); 
     context.Database.Create(); 
     _context = context; 
    } 

工作,只要我們沒有在Management Studio打開查詢。它不會影響我們的集成測試...

相關問題