[英]Unable to run EF5 migration with existing database
首先,我已經閱讀了這些問題/答案:
這些似乎都適用於EF5之前的EF版本,我的情況似乎不適合這些答案。 所以,讓我描述一下我的情況。
Entity Framework | Reverse engineer code first
Entity Framework | Reverse engineer code first
。 現在,我想嘗試自動遷移,我在Ruby on Rails中有一些經驗。 這是我做的:
Enable-Migrations
。 由於連接字符串和app.config被使用而有點麻煩,但最終得到了它。 但是, 這個MSDN頁面說這應該自動生成第一次遷移,以使我達到我已經到達的程度。 它沒有。 Add-Migration InitialSchema
來完成在步驟1中未自動完成的操作。這有效。 Add-Migration AddSerialToLogEntries
,並顯示: 無法生成顯式遷移,因為以下顯式遷移尚未處理:[201307190100268_InitialSchema]。 在嘗試生成新的顯式遷移之前應用掛起的顯式遷移。
嘗試在我現有的數據庫上應用遷移失敗,這並不奇怪。
我上面提到的其他答案基本上說我運氣不好,但就像我說的那些是舊版本的實體框架。 我有什么選擇嗎?
在寫這個問題時,我想我可以使用SQL Server Management Studio將我的數據導出到SQL腳本,刪除整個數據庫,讓EF創建它,然后運行腳本來重新獲取我的數據......我會在明天有空的時候嘗試,但我想聽聽是否還有其他選擇,因為我不是100%肯定會工作,並且不願意在流程中插入的數據中出現任何錯誤。
Ran Enable-Migrations。 由於連接字符串和app.config被使用而有點麻煩,但最終得到了它。 但是,這個MSDN頁面說這應該自動生成第一次遷移,以使我達到我已經到達的程度。 它沒有。
Ran Add-Migration InitialSchema來完成在步驟1中未自動完成的操作。這有效。
實際上,只有在已使用Code-First創建數據庫之前, enable-migrations
命令才會創建初始遷移,在此情況下,數據庫包含__MigrationHistory
表。 如果此表不存在(具有以前從未使用Code-First創建的現有數據庫的情況),則enable-migrations
僅創建Configuration
類。 您必須手動調用add-migration
,然后創建第一個遷移類。 所以,你所看到的行為是預料之中的。
通常,如果您使用的是EF 5,則為遷移准備現有數據庫的過程如下:
在包管理器控制台中調用enable-migrations
。 將創建項目中的Migrations
文件夾和Configuration
類。
打開Configuration
類並在構造函數中設置AutomaticMigrationsEnabled = false
(如果它尚未默認)。
在包管理器控制台調用中
add-migration -IgnoreChanges InitialSchema
“InitialSchema”只是一個示例名稱。 您可以按照自己的意願命名。 將創建一個從DbMigration
派生的<Timestamp>_InitialSchema
類。 由於-IgnoreChanges
標志,此類中的Up
和Down
方法為空。 如果沒有此標志,則類將包含遷移以將整個模型添加到數據庫,這不是您想要的,因為現有數據庫已包含數據庫模式。
在包管理器控制台中運行update-database
。 因為Up
方法為空,所以此更新不會對現有模式執行任何操作, 除非它創建__MigrationHistory
表(作為數據庫中的系統表),並將第一條記錄添加到此表中,其中包含當前EF模型的模型哈希。
可選的最后一步:如果您更喜歡使用自動遷移,請打開Configuration
類並在構造函數中設置AutomaticMigrationsEnabled = true
。 如果要繼續進行基於代碼的遷移,請將標志設置為false
。
此時,您可以開始對模型進行更改。 每次使用add-migration
創建新遷移時,它將在修改之前基於您的模型,遷移類將僅包含必要的模式更改。
我建議采用稍微不同的方法,使您處於可以使用遷移在開發環境中從頭開始創建數據庫的狀態:
而不是調用add-migration -IgnoreChanges InitialSchema
,嘗試使初始模式遷移的生成工作。 正如您所說,這應該在您最初調用Enable-Migrations
時發生。 您可以嘗試將數據庫連接指向不存在的數據庫以使其正常工作。
因此,您的InitialSchema
遷移將包含創建數據庫的邏輯,就像您在逆向工程時一樣。 您需要注釋掉Up()
和Down()
的內容,直到您已部署到已有現有數據庫的所有環境。
然后,您可以取消注釋這些方法的內容,從那時起,在開發環境中,您可以刪除數據庫並使用它們重新創建它們。
var migrator = new DbMigrator(new Configuration()); migrator.Update();
並且您將在__MigrationHistory
表中擁有完整的遷移集。 這很重要,因為沒有它,您將來無法添加新的遷移。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.