前言
本文所謂數據遷移,直白點不如說成數據庫升級。雖然大部分帶服務器型的應用,所有客戶端都是連到同一臺服務器上,對這樣的生產環境,數據庫升級起來不是什麼難事,用vs自帶的Migration也好,執行sql腳本也好,都比較容易。然而在每家客戶現場都要部署一臺服務器的應用也不少,如果一家家手工地去升級數據庫,那將是一個可怕的工作量。那麼對於這樣的環境要怎麼做到自動升級數據庫呢?相信大家也在網上搜了不少了EF關於生產環境下的數據遷移方案,然後99%搜到的都是使用vs自帶的Migration命令方式遷移,我也不知道爲什麼沒人分享生產環境下的數據遷移,這明明是很重要的一個環節。
步驟
1、創建實體
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; } } }
2、創建DbContext
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; } } }
3、打開程序包管理控制檯,輸入PM> enable-migrations,vs自動生成了Configuration類
注意,生成的Configuration構造函數中AutomaticMigrationsEnabled值是false, 我們把它改成true,啓用自動遷移。然後根據自已的需要設置數據庫升級時是否允許數據丟失,建議還在開發階段設AutomaticMigrationDataLossAllowed = true;直第一個生產環境發佈了,將其改爲AutomaticMigrationDataLossAllowed = false;以免造成客戶重要數據丟失。這裏的數據丟失指的是,例如:User表中,第一個版本有個Name字段,並且已經有數據錄入了,然後第二個版本將Name字段刪除了,此時若AutomaticMigrationDataLossAllowed = false則會出拋出異常,無法遷移。
3、修改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; } } }
簡單的三個步驟就完成了生產環境的自動遷移,不知道爲什麼找不到這個的文章。接下來只想辦法把客戶現場的程序集替換便能自動升級數據了。
標籤:
原文地址:http://www.cnblogs.com/uucode/p/5850140.html