簡體   English   中英

無法使用現有數據庫運行EF5遷移

[英]Unable to run EF5 migration with existing database

首先,我已經閱讀了這些問題/答案:

這些似乎都適用於EF5之前的EF版本,我的情況似乎不適合這些答案。 所以,讓我描述一下我的情況。

  1. 我的應用程序最初是使用EF4創建的,模型優先。 我使用GUI設計器設計了我的數據庫,並用它來生成我的數據庫。
  2. 我已經運行並將數據收集到數據庫中幾個月了。 我真的不能丟失這些數據。
  3. 我分支我的代碼,用NuGet安裝EF5,並使用EF Power Tools通過右鍵單擊一個新的類庫項目從我的數據庫生成我的模型,然后選擇Entity Framework | Reverse engineer code first Entity Framework | Reverse engineer code first
  4. 我能夠順利地重新引用我的新項目,將我的項目轉換為使用新的DbContext而不是ObjectContext,並刪除了保存舊模型的EF4類庫。 該計划效果很好!

現在,我想嘗試自動遷移,我在Ruby on Rails中有一些經驗。 這是我做的:

  1. Ran Enable-Migrations 由於連接字符串和app.config被使用而有點麻煩,但最終得到了它。 但是, 這個MSDN頁面說這應該自動生成第一次遷移,以使我達到我已經到達的程度。 它沒有。
  2. Ran Add-Migration InitialSchema來完成在步驟1中未自動完成的操作。這有效。
  3. 向我的某個模型對象添加了一個屬性,然后嘗試運行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標志,此類中的UpDown方法為空。 如果沒有此標志,則類將包含遷移以將整個模型添加到數據庫,這不是您想要的,因為現有數據庫已包含數據庫模式。

  • 在包管理器控制台中運行update-database 因為Up方法為空,所以此更新不會對現有模式執行任何操作, 除非它創建__MigrationHistory表(作為數據庫中的系統表),並將第一條記錄添加到此表中,其中包含當前EF模型的模型哈希。

  • 可選的最后一步:如果您更喜歡使用自動遷移,請打開Configuration類並在構造函數中設置AutomaticMigrationsEnabled = true 如果要繼續進行基於代碼的遷移,請將標志設置為false

此時,您可以開始對模型進行更改。 每次使用add-migration創建新遷移時,它將在修改之前基於您的模型,遷移類將僅包含必要的模式更改。

我建議采用稍微不同的方法,使您處於可以使用遷移在開發環境中從頭開始創建數據庫的狀態:

  1. 而不是調用add-migration -IgnoreChanges InitialSchema ,嘗試使初始模式遷移的生成工作。 正如您所說,這應該在您最初調用Enable-Migrations時發生。 您可以嘗試將數據庫連接指向不存在的數據庫以使其正常工作。

  2. 因此,您的InitialSchema遷移將包含創建數據庫的邏輯,就像您在逆向工程時一樣。 您需要注釋掉Up()Down()的內容,直到您已部署到已有現有數據庫的所有環境。

  3. 然后,您可以取消注釋這些方法的內容,從那時起,在開發環境中,您可以刪除數據庫並使用它們重新創建它們。

     var migrator = new DbMigrator(new Configuration()); migrator.Update(); 

    並且您將在__MigrationHistory表中擁有完整的遷移集。 這很重要,因為沒有它,您將來無法添加新的遷移。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM