Code First Migrations
在MVC开发当中难免会对类进行修改,修改后再次运行就会出现异常,提示上下文的模型已在数据库创建后发生改变。
支持“AppContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。
如果是项目初期开发倒是好办,可以删掉数据库重新建立,但是如果项目已经运行了,我想你不会想初期那样做吧,会照成数据丢失的。这个时候就需要使用EF的数据迁移功能了,下面教你如何使用数据迁移。
启用迁移
打开VS,工具>库程序包管理器>程序包管理器控制台。
在控制台中输入Enable-Migrations(不分大小写),如下图所示
输入这个命令后还会在项目中创建Migrations文件夹,里面包含两个文件
- Configuration.cs 这个类允许你自己配置对AppContext上下文迁移的行为。比如添加一些数据的初始化操作,例如:
context.Blogs.AddOrUpdate(
p => p.Title,
new Blog { Title = "测试标题1", Content = "内容1" },
new Blog { Title = "测试标题2", Content = "内容2" }
); - 201403310555286_InitialCreate.cs,这个文件名是由 时间戳+下划线+ Initial.cs组成的,这个类包含了创建数据库架构的代码。
生成和运行迁移
Code First的数据迁移有两个命令:
- Add-Migration 对比当前数据库和模型的差异,生成相应的代码,使数据库和模型匹配的。
- Update-Database 将任何挂起的迁移到数据库。
在控制台中输入Add-Migration AddBlogCreate,回车运行.
AddBlogCreate 是可以随意取的,是EF进行数据迁移的一个标识,为了更好知道这次迁移是干什么的最好取有意义的名称。命令运行完后,打开新添加的201403310649014_AddBlogCreate类,在Up方法里面可以看到添加新列的代码。
public partial class AddBlogCreate : DbMigration
{
public override void Up()
{
AddColumn("dbo.Blogs", "CreateTime", c => c.DateTime(nullable: false));
} public override void Down()
{
DropColumn("dbo.Blogs", "CreateTime");
}
}
在程序包管理器控制台运行Update-Database 提交到数据库,在数据库中你将会看到新增的CreateTime列.而且在Configuration类中的send方法也会执行。
迁移到一个特定的版本(包括降级)
在程序包管理器控制台中运行Update-Database –TargetMigration: AddBlogCreate,数据库将还原到新增CreateTime属性的时候。
启用自动迁移
如果你想你部署的应用程序在启动的时候自动升级数据库,你可以通过注册数据库初始化MigrateDatabaseToLatestVersion做到这一点。
将Configuration构造函数的设置为:AutomaticMigrationsEnabled=true,AutomaticMigrationDataLossAllowed=true.
public Configuration() {
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
在Global.asax的 Application_Start 方法中添加以下代码:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<AppContext, Configuration>());
参考:
http://msdn.microsoft.com/en-us/data/jj591621
最新文章
- Jquery.Qrcode在客户端动态生成二维码并添加自定义Logo
- 相似度分析,循环读入文件(加入了HanLP,算法第四版的库)
- docker基础命令
- Android学习笔记之ConnectivityManager+NetWorkInfo
- Retrofit源码设计模式解析(上)
- XAMPP Apache 配置多端口和多域名方法
- installshield 注册dll
- LoadRunner 学习笔记(3)基础
- Appboy 基于 MongoDB 的数据密集型实践
- Asp.net mvc 中View的呈现(一)
- 【Codeforces 1000F】One Occurrence
- 了解一下Redis队列【缓兵之计-延时队列】
- Java基础中的RMI介绍与使用
- Spark2.2(三十九):如何根据appName监控spark任务,当任务不存在则启动(任务存在当超过多久没有活动状态则kill,等待下次启动)
- 使用Swagger2构建强大的RESTful API文档(1)(二十二)
- 如何启动、关闭和设置ubuntu防火墙
- 使用 Jenkins 和 Team Services 将应用部署到 Linux VM
- parameter ";timeout"; in socketchannel does not work
- wepy中如何使用stylus等样式预处理器
- commit命令
热门文章
- 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法
- c#与java的区别
- Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持
- Entity Framework教程(第二版)
- PowerDesigner-VBSrcipt-自动设置主键,外键名等(SQL Server)
- Android raw to bmp
- 【需求设计1】VIP积分系统无聊YY
- Chrome V8引擎系列随笔 (1):Math.Random()函数概览
- Linux实战教学笔记06:Linux系统基础优化
- CentOS 7 上部署Mono 4 和Jexus 5.6