2014-12-05 83 views
3

我試圖從實體框架中刪除我的應用程序的數據庫表單。 我使用的代碼如下:使用實體框架刪除數據庫

using (var dbContext = container.Resolve<ApplicationDbContext>()) 
    { 
     dbContext.Database.Delete(); 
    } 

根據msdn這應該工作,但沒有任何反應。

dbContext使用ContainerControlledLifetimeManager進行註冊,應該與用於創建數據庫的實例相同。

回答

2

添加,更新和刪除實體類型的實例需要dbContext.SaveChanges()以反映更改。

dbContext.Database.Delete()不需要dbContext.SaveChanges()

例如,如果你的數據庫,你打開的連接從SQL Management Studio並嘗試dbContext.Database.Delete()然後您會收到Cannot drop database "dbContext" because it is currently in use.如果重新啓動您的SQL Server,你把這些連接,然後重試dbContext.Database.Delete()您成功地刪除數據庫。

最後一件事是在Sql Management Studio中刷新數據庫列表以便看到數據庫不存在。

測試這個代碼片段:

using (var dbContext = new dbContext()) 
{ 
    dbContext.Database.Delete(); 
} 
+0

不,不變。 – 2014-12-10 14:55:09

+0

嘗試使用'使用(var dbContext = new ApplicationDbContext())' – 2014-12-11 06:33:54

+0

綁定它,但無濟於事。 DB仍然在那裏。 – 2014-12-11 15:18:28

1

@moguzalp之後,這(MSDN Database.Delete Function),我帶着我的情況的解決方案:

using System.Data.Entity; 

Database.Delete("connectionStringOrName"); 

在我來說,我試圖重新創建用於測試目的的mssqllocalDb數據庫。但是,無論何時我使用相同的DbContext(或者立即使用新的DbContext,處理第一個並打開另一個),看起來數據庫在我嘗試創建時仍處於運行狀態。

不好的例子:(X)

public static void RecreateDatabase(string schemaScript) 
{ 
    using (DbContext context = new DbContext("connectionStringName")) 
    { 
     context.Database.Delete(); // Delete returns true, but... 
     Database database = context.Database; 
     database.Create(); // Database already exists! 
     database.ExecuteSqlCommand(schemaScript); 
    } 
} 

工作實施例:(/)

public static void RecreateDatabase(string schemaScript) 
{ 
    Database.Delete(); // Opens and disposes its own connection 

    using (DbContext context = new DbContext("connectionStringName")) // New connection 
    { 
     Database database = context.Database; 
     database.Create(); // Works! 
     database.ExecuteSqlCommand(schemaScript); 
    } 
} 

上下文:我使用此上的[AssemblyInitialize]功能測試我ModelContexts