2014-05-01 21 views
0

實體框架6.0.2。 .Net 4.我試圖從代碼更新SQL Server CE 4.0數據庫,因此當新版本的應用程序發佈時,數據庫會自動升級。EF6 + SQL Server CE +兩個上下文+ CodeFirst從代碼遷移 - 在添加遷移後檢測掛起的更改

有在項目中的兩個數據的背景和他們的目標是兩個不同的數據庫。這是我在做什麼更新其中的一個:

Private Sub UpdateDatabase(connectionString As String) 
    Dim config As DbMigrationsConfiguration(Of MainDBContext) = New DbMigrationsConfiguration(Of MainDBContext)() 
    config.TargetDatabase = New System.Data.Entity.Infrastructure.DbConnectionInfo(connectionString, "System.Data.SqlServerCe.4.0") 
    config.ContextKey = "MyProject.MainDBContext" 
    Dim migrator As DbMigrator = New DbMigrator(config) 
    migrator.Update() 
End Sub 

從更新方法的消息是,有待定更改,所以我必須要麼運行Add-遷移或啓用自動遷移。但是,Add-Migration已經運行,當我允許自動遷移時,Update會嘗試創建已經存在於數據庫中的表。

運行UpdateDatabase當這樣調用工作正常:

Update-Database -configuration MyProject.MigrationsMainDb.Configuration -Verbose 

我查了一下,在UpdateDatabase功能使用的連接字符串是一樣的一個在配置文件(UpdateDatabase使用)。我也嘗試不設置ContextKey屬性,但它沒有任何區別。

有什麼明顯的,我做錯了什麼?爲什麼遷移者認爲有未決的更新,但更新數據庫是好的......?

回答

0

我使它工作。我意識到,不是創建「通用」配置類,而是創建通過啓用遷移命令添加到項目中的配置類。因此代碼已被更改爲以下內容:

Private Sub UpdateDatabase(connectionString As String) 
    Dim config As MigrationsMainDb.Configuration = New MigrationsMainDb.Configuration() 
    config.TargetDatabase = New System.Data.Entity.Infrastructure.DbConnectionInfo(connectionString, "System.Data.SqlServerCe.4.0") 
    Dim migrator As DbMigrator = New DbMigrator(config) 
    migrator.Update() 
End Sub 

而這種更改導致配置對象的屬性正確設置。例如MigrationsDirectory屬性,它之前沒有設置它應該是。這可能是問題的原因 - 遷移者未找到遷移(在錯誤的目錄中查找它們)並假設整個模型必須應用於數據庫。

進行此更改後,我仍然有一個小故障與掛起的更改。在Visual Studio中,一個文件看起來像修改過的,在類中有一個額外的(測試)屬性,但是當我試圖刪除額外的行時,我收到了來自VS的消息,如「編輯在主」上,或類似的東西。我關閉了文件並重新打開 - 額外的財產消失了。我想這是用git的東西,檢查分支和VS不正確刷新文件?不確定。但是,一旦這條線不再存在,並且修改後的代碼就位,Update功能就會正常工作。現在

更新更新現有的數據庫,併成功創建了新的問題。太棒了:)