2016-01-22 47 views
3

我正在使用實體框架6.1.3我的ASP.NET項目的代碼優先遷移。我禁用了自動遷移。我運行了Add-MigrationUpdate-Database命令,EF無法找到__MigrationHistoryDbContext之間的任何未決更改。但是,當我啓動應用程序時,它會嘗試從上下文創建表,如果這些表已存在於__MigrationHistory表中的最新條目中。 (我從遷移表中檢查了EDMX XML文件,只是可以肯定的)。你有什麼想法,我如何解決這個問題,而不會丟失任何數據? tes test testEF6嘗試在運行時創建表,但沒有未完成的更改

+0

聽起來像您的遷移可能不同步。您可以找到試圖創建「City」表的遷移,並將現有表的所有代碼註釋掉,並將其應用於update-database,或者您可以創建新的基線遷移(Add-Migration InitialCreate -IgnoreChanges)https ://msdn.microsoft.com/en-us/data/dn579398.aspx#option1 –

+1

我在下面的評論中看到您有一個單獨的身份上下文。確保您的目標是正確的遷移上下文(-ContextTypeName)或使您的應用上下文從IdentityDbContext繼承。 –

+0

是的,我已經雙倍和三倍檢查。問題是我沒有在'DbMigrationsConfiguration'中設置屬性'MigrationsNamespace',導致另一個'DbContext'被錯誤的遷移所遷移。 – ax1mx2

回答

2

如果你不想讓你的應用程序始終重新在運行時創建的表,你必須改變數據庫的初始化。在你DBContext類,你應該會看到像這樣的代碼(假設你的DBContext被稱爲MyDbContext):

static MyDbContext() 
{ 
    // You should see this... 
    Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>()); 
    // ... or this ... 
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDbContext>()); 
} 

首先初始化將始終重新創建數據庫,第二初始化只會重新創建數據庫,如果該模型具有改變。如果未指定初始化程序,則缺省值爲CreateDatabaseIfNotExists,如名稱所示,它將創建數據庫(如果尚不存在)。您可以選擇在您的配置文件中設置初始值設定項。有關更多示例和信息,請參閱this resource

+0

我有這段代碼在我的上下文'OnModelCreating'方法'Database.SetInitializer(新MigrateDatabaseToLatestVersion ());'我應該刪除它嗎? – ax1mx2

+1

這是您看到初始化程序被設置的唯一位置嗎?運行搜索'SetInitializer'來查看它是否在其他地方彈出。 – Chase

+0

我把它放在另一個'DbContext'中,我需要它,因爲對於這種情況我啓用了自動遷移(這是ASP.NET Identity Framework的上下文)。這是不是會殺死我的自動遷移?如果我甚至從那裏刪除它,EF不會嘗試重新創建數據庫,但是這是正確的方式嗎? – ax1mx2

相關問題