前言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; } } }
简单的三个步骤就完成了生产环境的自动迁移,不知道为何找不到这个的文章。接下来只想办法把客户现场的程序集替换便能自动升级数据了。部署