用了Codefirst后最大的困擾就是數據變化引起數據庫的刪除再新建,這樣會造成數據丟失,musicstore中介紹的播種辦法也只能滿足下測試的需要。在EntityFrameWork5.0中引入了數據遷移功能能很好的解決這個問題。
步驟一:
需要EF5.0,最好用NuGet來安裝。工具-->庫程序包管理器-->程序包管理控制台(我用的VS2012)
輸入命令,安裝最新的ef。如下
輸入get-help NuGet 可以查看其它的命令

主題 about_NuGet 簡短描述 提供有關 NuGet 程序包管理器命令的信息。 詳細描述 本主題介紹 NuGet 程序包管理器命令。NuGet 是集成的程序包 管理工具,用於將庫和工具添加到 .NET 項目。 包括了以下 NuGet cmdlets。 Cmdlet 描述 ------------------ ---------------------------------------------- Get-Package 獲取程序包源中可用的程序包集。 Install-Package 在項目中安裝程序包及其依賴項。 Uninstall-Package 卸載程序包。如果其他程序包依賴於此程序包, 則該命令將會失敗,除非指定了 -Force 選項。 Update-Package 將程序包及其依賴項更新為較新版本。 Add-BindingRedirect 檢查項目輸出路徑中的所有程序集, 並根據需要將綁定重定向添加到 應用程序(或 Web)配置文件。 Get-Project 為指定的項目返回對 DTE (Development Tools Environment) 的引用。如果未指定任何項目,則返回 程序包管理器控制台中選擇的默認項目。 Open-PackagePage 打開瀏覽器,並指向指定的程序包的 ProjectUrl, LicenseUrl 或 ReportAbuseUrl。 Register-TabExpansion 為命令的參數注冊選項卡擴展。 另請參閱 聯機文檔: http://go.microsoft.com/fwlink/?LinkID=206619 Get-Package Install-Package Uninstall-Package Update-Package Add-BindingRedirect Get-Project Open-PackagePage Register-TabExpansion
步驟二:
允許數據遷移,繼續輸入命令:PM> enable-migrations 會自動生成migration配置文件類,在構造函數中加入黃色mark的部分,允許自動遷移。比如你Model里面修改了字段類型,長度,或者增加了字段。它來自動修改數據庫。但這還沒有結束
namespace NoteSystem.Migrations { using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; internal sealed class Configuration<TContext> : DbMigrationsConfiguration<TContext> where TContext:DbContext { public Configuration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; } } }
步驟三:修改數據庫的構造函數,我的數據庫這里是NoteDb ,灰色部分我們之前用的方式,很不好,黃色部分就是支持數據遷移初始化。
public NoteDb() : base(DbNameOrDbConnectionstring) { Database.SetInitializer(new MigrateDatabaseToLatestVersion<NoteDb, Configuration<NoteDb>>());
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges<NoteDb>()); }
總結:這個migration還是省了不少事情,但也不是那么的完全智能,最好不要手動去刪除數據庫中的表,通過dbset來刪除,因為數據庫所有的操作記錄是記錄在數據庫中,在系統表的MigrationHistory 中。 你的手動記錄是沒有存在這里面的。