EF Code First Migration總結

開啓Migration

1. 經過 Tools->Nuget Package Manager->Package Manager Console 打開Package Manager Console窗口數據庫

2. Default Project選擇當前的DbContext所在的項目ide

3. 經過命令開啓Migration函數

Enable-Migrations

開啓以後,DbContext對應的項目中會生成一個Migrations的文件夾, 主要用來存放各個版本自動生成的更新描述文件spa

相似於下圖:code

image

初始化庫

一般你新建了模型,在數據庫建庫以後須要執行一次add-migration命令生成一個庫初始化的migration記錄視頻

add-migration 20160201003

後面部分的名字我一般都會按照當天日期拼接當天的版本號組成,另一種不錯的實踐是按照增長的業務名稱命名,英文名稱會相對好點.blog

更新庫

庫的更新能夠分爲手動更新跟自動更新, 一般Code First Migration的文章都會講這裏要經過Update-Database命令來把剛纔的變動更新到庫裏面, 一般DEV環境能夠這麼作,由於是直連的, 可是咱們的Staging與Production環境是不能夠直連的,咱們要怎麼作呢?接口

前面有提到能夠自動更新,其意思就是說,你經過 add-migration生成了migration腳本,那當程序啓動的時候,若是發現數庫接口不一致,那這個就須要更新,這個時候若是是自動更新的狀態,那程序會自動執行(從意思上等同於update-database, 產生的效果相同,可是並未實際考證是否也是跑的update-database命令), 所以不管是dev環境仍是staging, production均可以經過自動update-database來完成數據庫的更新。圖片

如何設置自動更新

這裏有兩步:get

1. 在migrations文件夾下有個configuration的文件, 代碼以下:

public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = false;
        }

AutomaticMigrationsEnable = true 以後, 設置EF爲自動作數據庫更新。

2. 在Global.cs或者任何程序啓動的地方加入:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<CustomerDbContext, Configuration>());

這句是設定當前DbContext的一個初始化配置.

潛在的問題

自動遷移,在某些該名稱,或者刪除字段的時候,會形成現有數據的丟失,這個須要注意,目前我也是在探索過程當中,有進一步的研究成果,會在更新博文說明。

 

【補充部分】

初始化腳本的更新

public partial class InitDefaultData : DbMigration
    {
        public override void Up()
        {
            Sql(@"
--初始化FileType原始數據
insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10001,'客戶資料',0,GETDATE();
insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10002,'訂單資料',0,GETDATE();
insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10003,'車輛資料',0,GETDATE();

--初始化FileCategory原始數據
insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),1,'圖片',0,GETDATE();
insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),2,'複印件',0,GETDATE();
insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),3,'視頻',0,GETDATE();
insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),4,'Excel文件',0,GETDATE();
insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),5,'Word文件',0,GETDATE();
");
        }

        public override void Down()
        {
            Sql(@"truncate table FileType");
            Sql(@"truncate table FileCategory");
        }
    }

能夠經過Sql函數來執行一些自定義的SQL腳本。

相關文章
相關標籤/搜索