2012-03-29 128 views
6

我有我使用DbContext.Database.Create()最近建立了一個數據庫的本地實例,所以__MigrationHistory表的InitalCreate條目的代碼的時刻匹配存在。讓EF4.3代碼首先遷移忽略掛起的遷移

一些基於代碼的遷移在遷移文件夾中存在,但是。這些將在我們的開發和分期環境中運行,以使這些數據庫符合代碼。但是,我不需要在本地應用它們,因爲我使用當前代碼創建了數據庫。

我現在需要做出改變的模型,並創建相應的遷移。但是,當我運行Add-Migration TestMigration,我得到以下錯誤

Unable to generate an explicit migration because the following explicit 
migrations are pending: 

[201203271113060_AddTableX, 
201203290856574_AlterColumnY] 

Apply the pending explicit migrations before attempting to generate 
a new explicit migration. 

我應該在這種情況下怎麼辦?我無法將添加遷移工具指向其他環境,因爲無法保證版本與本地版本匹配。我想要一個僅匹配我所做更改的遷移。

看來我有幾個選擇,但沒有一個是理想的:

  1. 刪除該文件夾遷移其他遷移,運行Add-遷移命令,升級數據庫,然後恢復舊的遷移。這很簡單,但似乎有點ha。。
  2. 恢復到首次遷移應用到的源代碼管理模型的版本,然後構建並使用它創建數據庫。然後獲取最新版本,應用所有遷移,然後我準備好添加我的遷移。這似乎是一個很大的努力!
  3. 手動創建遷移。

有沒有人有關於如何管理這個有什麼建議?

回答

2

我已經找到了最佳的工作是非常簡單的:一旦你激活不使用DbContext.Database.Create()遷移。如果您想以編程方式創建新數據庫,請改用遷移API。

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

那麼你已經有了完整的遷移歷史和預期進一步增加遷移工作而已。

2

我們計劃使用選項#1的變體...

我們的標準作業程序是生成每個遷移SQL腳本(通過更新數據庫的-script選項),爲了通過InstallShield將SQL腳本應用於最終用戶「生產」數據庫(我們計劃僅將EF update-database用於開發人員數據庫)。

因此,我們有兩個遷移的.cs文件,並在我們的遷移文件夾中的所有遷移對應的.sql文件。

因此而不是刪除從遷移文件夾中的遷移(如你在#1)提出,我們使用SQL管理Studio來手動應用該做插入到_MigrationHistory的.sql文件的只是部分。

這使本地數據庫保持最新與那些已經納入該數據庫的變化的_MigrationHistory。

但它是一個雜牌組裝電腦,而且我們還在尋找一個更好的解決方案。

DadCat

1

我遇到了同樣的問題。 如果運行

Update-database 

,然後運行

Add-Migration YourMigrationName 

這解決了問題

+1

這不起作用,因爲以前的遷移操作無法在使用'DbContext.Database.Create()'創建的數據庫上運行。想象一下添加一列的遷移,但是在你的新本地數據庫中你已經有了這個列,所以你得到一個'SqlException'並且相關的行不會被添加到'__MigrationHistory'表中。看到我的答案,我認爲是正確的方法。 – 2013-11-05 15:53:15

1

你要麼需要從包管理器控制檯運行「update-database」將更改推到數據庫,或者你可以從你的遷移文件夾中刪除掛起的遷移文件([201203271113060_AddTableX]),然後再運行「添加 - 遷移「根據您的編輯創建全新的遷移。

0

只是從解決方案文件中排除舊的遷移文件。