一、为模型更改设置 Code First 数据迁移
1、工具—>库程序包管理器—>程序包管理器控制台—>输入“Enable-Migrations” 或者
Enable-Migrations -ContextTypeName Mvc.Models.DataContext
Enable-Migrations -ContextTypeName 命名空间.上下文名称
注:如果正确的话 则显示“已为项目 xxx启用 Code First 迁移。”,
Enable-Migrations命令创建了一个Migrations文件夹和Configuration.cs文件
2、程序包管理器控制台—>输入“add-migration Initial”创建初始化迁移。
注:名称“Initial”是随意命名,即要添加的字段。用来命名创建好的迁移文件。
3、程序包管理器控制台—>输入“update-database”
4、运行程序,更新完毕。
二、进一步
问题已经解决了,我们再来深入一下这种迁移方式。
当我们增加列(增加实体字段)时,可以不必重复上面的所有操作。
1、只需要将\Migrations\Configuration.cs文件中的AutomaticMigrationsEnabled = false;改成true
2、工具—>库程序包管理器—>程序包管理器控制台—>输入“update-database”
三、当我们删除列(删除实体字段)时,同样使用上面的操作,没有成功,报会丢失数据,
所以不能简单地执行“update-database”就能完成。
1、执行命令“add-migration Initial”
2、执行命令“update database”
3、运行程序,更新完毕
四、很强大的迁移
public class ContactContext : DbContext
{
public ContactContext()
: base("name=DefaultConnection")
{
//自动创建表,如果Entity有改到就更新到表结构
Database.SetInitializer<ContactContext>(new MigrateDatabaseToLatestVersion<ContactContext, ReportingDbMigrationsConfiguration>());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); //表名为类名,不是上面带s的名字 //移除复数表名的契约
modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); //不创建EdmMetadata表 //防止黑幕交易 要不然每次都要访问 EdmMetadata这个表
}
public DbSet<City> Cities { get; set; }
public DbSet<Area> Area { get; set; }
public DbSet<Campaign> Campaign { get; set; }
}
internal sealed class ReportingDbMigrationsConfiguration : DbMigrationsConfiguration<ContactContext>
{
public ReportingDbMigrationsConfiguration()
{
AutomaticMigrationsEnabled = true;//任何Model Class的修改將會直接更新DB
AutomaticMigrationDataLossAllowed = true;
}
}
原文:http://www.cnblogs.com/zxp6/p/7502874.html