Entity Framework 5 Migrations:設置數據庫的初始遷移和單一種子
我有一個 MVC4 應用程序,我最近升級到了 Entity Framework 5,我正試圖將我們的數據庫轉移到使用從刪除和創建每次執行的開發風格的遷移。
這是我在應用程序啟動功能中所做的。
protected void Application_Start() { Database.SetInitializer( new MigrateDatabaseToLatestVersion< MyContext, Configuration >() ); ... }我在我的儲存庫項目上執行了該
Enable-Migrations命令,我認為這會創建一個初始遷移文件,但是它創建的唯一文件是Configuration當我刪除數據庫時,它首先通過程式碼按預期創建它,並從配置文件中為數據庫播種。在配置文件中,我將所有
Add()功能更改為AddOrUpdate()但是,
Configuration每次網站啟動並一次又一次地複制所有種子數據時,它都會在我的文件中執行種子功能。我想像它會創建一個
initial migration文件,因為我讀過的部落格建議它會,我可以把種子數據放在那裡,但它沒有誰能解釋我應該如何在程式碼中設置數據庫以便它只播種一次?
雖然這對於使用 EF migrate.exe 非常有趣,但我已經切換到使用Roundhouse來執行遷移。我仍然使用 EF 來基於模型建構我的遷移,但我編寫了一個小控制台應用程序來將遷移寫入 SQL 文件。然後我使用 Roundhouse 通過我的 rake 建構腳本自己執行遷移。涉及的過程要多一些,但它比在應用程序啟動時使用 EF 動態執行遷移要穩定得多。
這已被證明是一個受歡迎的文章,所以我根據其他人的回饋對其進行了更新。要知道的主要事情是 Configuration 類中的 Seed 方法在每次應用程序啟動時都會執行,這不是模板方法中的註釋所暗示的。請參閱 Microsoft 某人對這篇文章的回答,了解為什麼會這樣 - 感謝 Jason Learmouth 發現這一點。
如果您像我一樣,只想在有任何未決遷移的情況下執行數據庫更新,那麼您需要做更多的工作。您可以通過呼叫 migrator.GetPendingMigrations() 來確定是否存在待處理的遷移,但是您必須在 ctor 中執行此操作,因為在呼叫 Seed 方法之前會清除待處理的遷移列表。Migrations.Configuration 類中的實現程式碼如下:
internal sealed class Configuration : DbMigrationsConfiguration<YourDbContext> { private readonly bool _pendingMigrations; public Configuration() { // If you want automatic migrations the uncomment the line below. //AutomaticMigrationsEnabled = true; var migrator = new DbMigrator(this); _pendingMigrations = migrator.GetPendingMigrations().Any(); } protected override void Seed(MyDbContext context) { //Microsoft comment says "This method will be called after migrating to the latest version." //However my testing shows that it is called every time the software starts //Exit if there aren't any pending migrations if (!_pendingMigrations) return; //else run your code to seed the database, e.g. context.Foos.AddOrUpdate( new Foo { bar = true}); } }我應該指出,有些人建議將種子程式碼放在實際的“向上”遷移程式碼中。這可行,但意味著您需要記住將種子程式碼放入每個新的遷移中,並且很難記住,所以我不會這樣做。但是,如果您的種子隨著每次遷移而改變,那麼這可能是一個好方法。