2013-02-15 70 views
2

我正在用NUnit和Entity Framework编写一些UnitTests。 如何从实体框架级别删除整个localdb数据库?在Entity Framework中删除localdb代码优先

注意:我不想清除表格的数据。我想删除整个数据库。

而且我能够创建我的应用程序工作目录的LocalDB文件中提供的数据库尚未建立:

string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ""); 
var testDbFileName = String.Format(@"UnitTestDB.mdf"); 
var testDbFileNameWithPath = path + @"\" + testDbFileName; 

var connectionString = 
String.Format(
    @"Data Source=(localdb)\V11.0;Initial Catalog={0};Integrated Security=True;AttachDBFilename={1};MultipleActiveResultSets=True", 
    "UnitTestDB", testDbFileNameWithPath); 

//Here would be the code passing connection string to DbContext and so on.. 

只删除文件“UnitTestDB.mdf”是不够的。在SQL Management Studio中仍然有对db的引用

回答

5

有两种方法可以在代码中执行此操作。如果可以,请先坚持EF代码:-)

1)EF在上下文中有一个很好的选择。

Context.Database.Delete() 

2)如果你想老同学的SqlCommand/SqlConnection的方法是这样的黑客程序。...

public bool DropDB(string DBName, string ConnectionString) 
    { 

     SqlConnection conn = null; 
     SqlCommand cmd = null; 
     string stmt = null; 

     int rowCount = 0; 

     if (string.IsNullOrEmpty(DBName)) 
      throw new ArgumentNullException(DBName, "DBName required"); 

     try 
     { 
      conn = new SqlConnection(ConnectionString); 

      stmt = "DROP DATABASE " + DBName ; 

      cmd = new SqlCommand(stmt, conn); 
      conn.Open(); 
      rowCount = cmd.ExecuteNonQuery(); 
      conn.Close(); 
     } 
     catch (Exception) 
     { 
      //todo whatever 
      throw; 
     } 
     finally 
     { 
      if (conn != null) conn.Dispose(); 
      if (cmd != null) conn.Dispose(); 
     } 
     if (rowCount == -1) return true; 
     return false; 
    } 
+0

谢谢,非常有用的答案。在阅读之前,我通过生成一个新的Guid在TestFixture中创建了一个新的数据库,以便每次都重新创建数据库(及其结构)。然后我从SQL Management Studio级别删除所有数据库。 – lixonn 2013-02-21 11:30:16

相关问题