前言sql
本文所謂數據遷移,直白點不如說成數據庫升級。雖然大部分帶服務器型的應用,全部客戶端都是連到同一臺服務器上,對這樣的生產環境,數據庫升級起來不是什麼難事,用vs自帶的Migration也好,執行sql腳本也好,都比較容易。然而在每家客戶現場都要部署一臺服務器的應用也很多,若是一家家手工地去升級數據庫,那將是一個可怕的工做量。那麼對於這樣的環境要怎麼作到自動升級數據庫呢?相信你們也在網上搜了很多了EF關於生產環境下的數據遷移方案,而後99%搜到的都是使用vs自帶的Migration命令方式遷移,我也不知道爲何沒人分享生產環境下的數據遷移,這明明是很重要的一個環節。數據庫
步驟服務器
一、建立實體函數
using System.ComponentModel.DataAnnotations.Schema; namespace Migration { public class User { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } // public string Name { get; set; } public string NickName { get; set; } public int Sex { get; set; } } }
二、建立DbContextui
using System.Data.Entity; namespace Migration { [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] public class DbBase : DbContext { public DbBase() : base("dbConnect") { } public DbSet<User> Users { get; set; } } }
三、打開程序包管理控制檯,輸入PM> enable-migrations,vs自動生成了Configuration類spa
注意,生成的Configuration構造函數中AutomaticMigrationsEnabled值是false, 咱們把它改爲true,啓用自動遷移。而後根據自已的須要設置數據庫升級時是否容許數據丟失,建議還在開發階段設AutomaticMigrationDataLossAllowed = true;直第一個生產環境發佈了,將其改成AutomaticMigrationDataLossAllowed = false;以避免形成客戶重要數據丟失。這裏的數據丟失指的是,例如:User表中,第一個版本有個Name字段,而且已經有數據錄入了,而後第二個版本將Name字段刪除了,此時若AutomaticMigrationDataLossAllowed = false則會出拋出異常,沒法遷移。blog
三、修改DbContext開發
using System.Data.Entity; namespace Migration { [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] public class DbBase : DbContext { public DbBase() : base("dbConnect") { //自動遷移 Database.SetInitializer(new MigrateDatabaseToLatestVersion<DbBase, Migration.Migrations.Configuration>()); } public DbSet<User> Users { get; set; } } }
簡單的三個步驟就完成了生產環境的自動遷移,不知道爲何找不到這個的文章。接下來只想辦法把客戶現場的程序集替換便能自動升級數據了。部署