2013-11-24 28 views
0

每次我做update-database -v -f我希望我的數據庫完全丟棄,然後再次創建空。有可能嗎?從種子法刪除並創建數據庫?

我試圖刪除它,然後創建它,但它不起作用。奇怪的是,我在EF4中做了完全相同的事情,它確實有效,但現在不行。

那麼如何使用某些命令重新創建我的數據庫?

爲上下文「MainDataContext」啓用遷移,但數據庫不存在或不包含映射表。使用Migrations創建數據庫及其表格,例如通過在程序包管理器控制檯中運行「Update-Database」命令。

這是我種方法

protected override void Seed(Api.Models.MainDataContext context) 
{ 
    context.Database.Delete(); 
    context.Database.Create(); 
    // context.Database.Initialize(true); Also tried this but same result 
} 

注:與原查詢不起作用,太多的關係截斷。
注意:刪除所有對象是不好的主意,太多的對象。

回答

1

你能也許第一次運行更新,數據庫就像這樣:

Update-Database -TargetMigration:0 

那將推出所有遷移回零。然後再次運行更新數據庫。

編輯:種子方法不應該對數據庫結構做任何事情,它應該只修改數據。應該使用遷移。

編輯2:我找不到有關使用更新數據庫刪除數據庫的信息,它只會在第一次遷移之前回滾,您似乎沒有。 只有通過代碼部署時,纔可以使用DropCreateDatabaseAlways-strategy:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx 如果要手動執行遷移,則可能必須在運行Update-Database之前手動刪除數據庫。

+0

奇怪,它給我'目標數據庫已經在0.' – sed

+0

版本嘗試把一個特定的目標名稱,而不是回滾:'更新 - 數據庫-TargetMigration:MyMigration' – Bruno

0

當模型更改時是否要刪除並重新創建數據庫?如何...

Database.SetInitializer(new DropCreateDatabaseIfModelChanges());

你說得對,EF6改變了遷移的處理方式。

您將不得不刪除您的Migrations文件夾及其中的所有課程。

@cederlof正確的是update-database:沒有drop數據庫切換或create數據庫切換。創建EF6數據庫的唯一方法是創建新的CloudMinderDataContext(某些連接字符串)

我遇到問題,因爲我想遷移來更新暫存數據庫,但是無法在代碼中創建新數據庫。這在EF4中很好,但在EF6中沒有。我不得不使用SQL來創建數據庫,然後遷移它...

How do I generate an EF6 database with migrations enabled, without using update-database?

http://softwaremechanik.wordpress.com/2013/11/04/ef6-if-migrations-are-enabled-cannot-createdatabaseifnotexists/

+0

是的,我知道,但如果我的模型根本沒有改變。我只想放棄它並重新創建。原因是密集測試。 – sed

0

喜史蒂夫:要刪除一個數據庫使用。如果你是集成測試你的測試實際上可能以並行方式運行,從而確保您已調用此之前,該數據庫完成...

private void DropDatabase(string connectionString) 
    { 
     var bld = new SqlConnectionStringBuilder(connectionString); 

     var dbName = bld.InitialCatalog; //database you want to drop 

     bld.InitialCatalog = "master"; 

     var masterConnectionString = bld.ConnectionString; 

     using (var cnn = new SqlConnection(masterConnectionString)) 
     { 

      using (var cmd = new System.Data.SqlClient.SqlCommand()) 
      { 
       cmd.Connection = cnn; 
       cnn.Open(); 
       cmd.CommandText = string.Format("ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE", 
           dbName); 
       cmd.ExecuteNonQuery(); 
       cmd.CommandText = string.Format("DROP DATABASE {0}", 
           dbName); 
       cmd.ExecuteNonQuery(); 
      } 
     }    
    } 
+0

我實際上是在每個測試中創建一個數據庫,並使用ClassCleanup在最後敲擊它們... http://softwaremechanik.wordpress.com/2013/11/26/ef6-integration-testing-some-useful-procs / – ajd

相關問題