2016-01-20 114 views
3

我試圖創建一個服務調用,將EF代碼第一個數據庫更新到最新版本。但是,它總是嘗試(並且明顯失敗)執行所有遷移,無論它們是否已被執行。DbMigrator嘗試執行每次遷移,未檢測到執行的遷移

這裏是我的代碼:

 var config = new DbMigrationsConfiguration<MyContext>(); 
     config.MigrationsAssembly = typeof (MyContext).Assembly; 
     config.MigrationsNamespace = "Context.Migrations"; 

     //This had no effect 
     //config.SetHistoryContextFactory(connectionString.ProviderName, (connection, s) => new HistoryContext(context.Database.Connection, "dbo")); 
     var migrator = new DbMigrator(config); 

     //This gets every single migration, even the ones already executed before 
     var migrations = migrator.GetPendingMigrations(); 
     //This gets 0 migrations 
     var existing = migrator.GetDatabaseMigrations(); 
     //This gets all migrations 
     var other = migrator.GetLocalMigrations(); 

     //This returns true! So it knows all the migrations are already executed 
     var differ = context.Database.CompatibleWithModel(true); 
     //This will throw an exception because it's trying to create existing tables! 
     migrator.Update(); 

我可以證實,遷移歷史表中包含[DBO] [__ MigrationHistory]引用所有的老移民。

我檢查了遷移器中的連接字符串。我也嘗試手動設置歷史上下文工廠,以防其他地方沒有結果。另外,直接從控制檯運行update-database可以工作,並且沒有掛起的更新。

任何幫助表示讚賞

回答

4

確保DbMigrationsConfiguration.ContextKey設置正確。

這條線後默認值

var config = new DbMigrationsConfiguration<MyContext>(); 

會是這樣

"System.Data.Entity.Migrations.DbMigrationsConfiguration`1[MyContextNamespace.MyContext]" 

您需要添加以下行

config.ContextKey = "{Your_Context_Key}"; 

如果你不知道的情況下鍵,打開[dbo].[__MigrationHistory]表並查看ContextKey列。

一旦設置正確,如果您的數據庫是最新的,migrator.GetPendingMigrations()應返回空,migrator.GetDatabaseMigrations()應返回所有遷移。

+2

這就是它!當我獲准批准時,您的積分將在約21小時內抵達。 –

+1

Tbh我已經放棄並改變了我的整個程序。非常感謝! – Charbel

-1

如果您的數據庫的所有更新,你有沒有必要老遷移表,那麼我會建議你做的是刪除遷移的文件夾,並使用重新創建

enable-migrations 

我一直在做這個工作,當遷移陷入困境時。我從來不需要歷史上的遷移 - 一旦他們完成了他們的工作 - 他們已經完成了!如果您通過配置查看,請務必保存您的種子方法。你可以看看我以前的帖子,也許這也會有幫助。

Migrations

好運。

+0

感謝您的回答 - 我們總是設置同一個數據庫的新實例,因此刪除舊的遷移不是一種選擇 – Charbel

+0

一旦您修改了數據庫,新實例將在您啓用時設置爲最後一個形狀再次遷移。啓用遷移時,遷移爲您提供具有上一個最終數據形狀的腳本,並使用該腳本設置相同數據庫的新實例。這就像運行所有歷史舊腳本的最終快照。你會得到你的最終數據庫。然後再開始開發並添加到它。 – alikuli

+1

「如果您的數據庫全部更新」:提問者的問題是數據庫可能未更新。 –