簡體   English   中英

EF6 + SQL Server CE +兩個上下文+從代碼進行CodeFirst遷移-在添加遷移后檢測未決更改

[英]EF6 + SQL Server CE + two contexts+ CodeFirst Migrations from code - Detect Pending Changes after Add-Migration

實體框架6.0.2。 .Net 4.我正嘗試從代碼更新SQL Server CE 4.0數據庫,因此當發布新版本的應用程序時,數據庫將自動升級。

項目中有兩個數據上下文,它們針對兩個不同的數據庫。 這就是我要更新其中之一的操作:

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

來自Update方法的消息是,有待更改,因此我必須運行“添加遷移”或啟用“自動遷移”。 但是,已經運行了Add-Migration,並且當我允許自動遷移時,Update嘗試創建數據庫中已經存在的表。

像這樣被調用時,運行Update-Database可以正常工作:

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

我檢查了UpdateDatabase函數中使用的連接字符串是否與配置文件(由Update-Database使用)中的連接字符串相同。 我也嘗試不設置ContextKey屬性,但是沒有區別。

我做錯了什么嗎? 為什么遷移者認為有待處理的更新,但是Update-Database很好...?

我成功了 我意識到,與其創建“通用”配置類,不如創建由Enable-Migrations命令添加到項目中的配置類。 因此,代碼已更改為以下內容:

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的消息,例如“在master上編輯”或類似的消息。 我關閉了文件並重新打開-多余的屬性消失了。 我想這與git有關,檢查分支和VS無法正確刷新文件嗎? 不太確定。 但是一旦該行不再存在並且修改的代碼就位,Update函數便開始正常工作。

現在,更新將更新現有數據庫並成功創建新數據庫。 太好了:)

暫無
暫無

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

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