在MVC開發當中難免會對類進行修改,修改后再次運行就會出現異常,提示上下文的模型已在數據庫創建后發生改變。
支持“AppContext”上下文的模型已在數據庫創建后發生更改。請考慮使用 Code First 遷移更新數據庫(http://go.microsoft.com/fwlink/?LinkId=238269)。
如果是項目初期開發倒是好辦,可以刪掉數據庫重新建立,但是如果項目已經運行了,我想你不會想初期那樣做吧,會照成數據丟失的。這個時候就需要使用EF的數據遷移功能了,下面教你如何使用數據遷移。
啟用遷移
打開VS,工具>庫程序包管理器>程序包管理器控制臺。
在控制臺中輸入Enable-Migrations(不分大小寫),如下圖所示
輸入這個命令后還會在項目中創建Migrations文件夾,里面包含兩個文件
- Configuration.cs 這個類允許你自己配置對AppContext上下文遷移的行為。比如添加一些數據的初始化操作,例如:
context.Blogs.AddOrUpdate( p => p.Title, new Blog { Title = "測試標題1", Content = "內容1" }, new Blog { Title = "測試標題2", Content = "內容2" } );
- 201403310555286_InitialCreate.cs,這個文件名是由 時間戳+下劃線+ Initial.cs組成的,這個類包含了創建數據庫架構的代碼。
生成和運行遷移
Code First的數據遷移有兩個命令:
- Add-Migration 對比當前數據庫和模型的差異,生成相應的代碼,使數據庫和模型匹配的。
- Update-Database 將任何掛起的遷移到數據庫。
在控制臺中輸入Add-Migration AddBlogCreate,回車運行.
AddBlogCreate 是可以隨意取的,是EF進行數據遷移的一個標識,為了更好知道這次遷移是干什么的最好取有意義的名稱。命令運行完后,打開新添加的201403310649014_AddBlogCreate類,在Up方法里面可以看到添加新列的代碼。
public partial class AddBlogCreate : DbMigration { public override void Up() { AddColumn("dbo.Blogs", "CreateTime", c => c.DateTime(nullable: false)); } public override void Down() { DropColumn("dbo.Blogs", "CreateTime"); } }
在程序包管理器控制臺運行Update-Database 提交到數據庫,在數據庫中你將會看到新增的CreateTime列.而且在Configuration類中的send方法也會執行。
遷移到一個特定的版本(包括降級)
在程序包管理器控制臺中運行Update-Database –TargetMigration: AddBlogCreate,數據庫將還原到新增CreateTime屬性的時候。
啟用自動遷移
如果你想你部署的應用程序在啟動的時候自動升級數據庫,你可以通過注冊數據庫初始化MigrateDatabaseToLatestVersion做到這一點。
將Configuration構造函數的設置為:AutomaticMigrationsEnabled=true,AutomaticMigrationDataLossAllowed=true.
public Configuration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; }
在Global.asax的 Application_Start 方法中添加以下代碼:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<AppContext, Configuration>());
參考:
http://msdn.microsoft.com/en-us/data/jj591621
文章列表