2016-08-01 75 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打开查询。它不会影响我们的集成测试...

相关问题