3.3 使用Code First数据库迁移
当Entity Framework Code First的数据模型发生异动时,默认会引发一个System.InvalidOpertaionException异常。一种解决方法是在Global.asax文档里的Application_Sart方法上,加上一段System.Data.Entity.Database.SetInitializer()方法,让EF自动将数据库删除,然后重新创建模型。
System.Data.Entity.Database.SetInitializer(
new System.Data.Entity.DropCreateDatabaseIfModelChanges<MvcGuestbook.Models.MvcGuestbookContext>());
System.Data.Entity.DropCreateDatabaseIfModelChanges方法的作用是在Model发生改变时,会运行Drop和Create Database等动作。不过,这种将数据库砍掉重建的方式实在过于残暴,应该使用更人性化的方式,让EF帮助我们自动调整数据库架构,并且仍然保留现有数据库中的数据。而这种开发技术就是Code First数据库迁移(DB Migration)。Code First数据库迁移技术,在EF4.3.1版本之后才支持。
在本节的演示中,将用以下数据模型定义示范数据库迁移:
public class Guestbook
{
public int Id { get; set; } [Required]
public string Message { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedOn { get; set; } public virtual Member Member { get; set; }
} public class Member
{
public int Id { get; set; } [Required]
[MaxLength()]
public string Name { get; set; } [MaxLength()]
public string Email { get; set; } public virtual ICollection<Guestbook> Guestbooks { get; set; }
}
另外,在进行本节实验之前,请先将Global.asax中的以下程序代码进行批注:
System.Data.Entity.Database.SetInitializer(
new System.Data.Entity.DropCreateDatabaseIfModelChanges<MvcGuestbook.Models.MvcGuestbookContext>());
EF Code First数据库迁移的方法。
- Enable-Migrations
- Add-Migration Initial
- Update-Database
1. EF Code First如何记录版本
2. 启用数据库迁移
若要在项目中启用数据库迁移功能,必须先开启程序包管理器控制台(Package Manager Console)视图(点击“视图 | 其他窗口 | 程序包管理器控制台”),然后输入Enable-Migrations指令。
PM> Enable-Migrations -ContextTypeName MvcGuestbook.Models.MvcGuestbookContext
运行Enable-Migrations指令的过程中,VS2012会帮助我们在指定的项目里创建一个Migrations目录,该目录下还创建有两个重要的文档,一个是*_InitialCreate.cs文档,另一个是Configuration.cs文档。
3.运行数据库迁移
下面来更改Member数据模型。请新增两个字段:分别是Username与Password属性,定义如下:
public class Member
{
public int Id { get; set; } [Required]
[MaxLength()]
public string Name { get; set; } [MaxLength()]
public string Email { get; set; } [Required]
[MaxLength()]
public string Username { get; set; } [Required]
[MaxLength()]
public string Password { get; set; } public ICollection<Guestbook> Guestbooks { get; set; }
}
我们通过Package Manager Console输入Add-Migration指令,来新增一条数据库迁移版本,输入时必须带上一个“版本名称”参数。例如,要想取名为AddUsernamePassword,则可以输入以下指令:
PM> Add-Migration AddUsernamePassword
运行完成后一样会在Migrations文件夹中再新增一个文件,如图所示。

这次运行Add-Migration指令,所代表的意思就是新增一次运行数据库迁移命令,VS2012会自动对比当前数据库中的Model定义与当前更改过的数据模型,并将差异的字段变化写入这个自动新增的类别内。

每一次新增数据库迁移版本,其类别内都会包含一个Up()方法与Down()方法,所代表的意思分别是“升级数据库”与“降级数据库”的动作,所以数据库迁移不仅仅是将数据库升级,还可以恢复到旧版本。
当前还没有对数据库做任何迁移动作,所以数据库中的数据结构并没有任何改变,为了确认实际情况,可以先手动在Members数据表中输入几条数据,以确认过一会儿数据库迁移之后数据是否消失,如图所示。

接着我们正式对数据库进行迁移动作。请在程序包管理控制台视图中输入指令如下。
PM> Update-Database
更新数据库成功后,你可以再次检查Member数据表结构是否发生变化,还有数据表属性是否仍存在,如图所示。

4.自定义数据库迁移规则
5.自动数据库迁移
Enable-Migrations –EnableAutomaticMigration
对于实体插入操作,直接使用Update-Database
对于实体更新和删除操作,使用
Add-Migration Initial
Update-Database
6.如何避免数据库被自动创建或自动迁移
7.获取Sql脚本
- Update-Database –Script
- Update-Database –Script –SourceMigration:$InitialDatabase –TargetMigration: AddPostAbstract
8. 迁移到特定版本
Update-Database –TargetMigration:ad1
Update-Database –TargetMigration:$InitialDatabase
3.3 使用Code First数据库迁移的更多相关文章
- Entity Framework 5.0系列之Code First数据库迁移
我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...
- Code First 数据库迁移
当 Entity Framework Code First 的数据模型发生改变时,默认会引发一个System.InvalidOperationException 的异常.解决方法是使用DropCrea ...
- 使用 Code First 数据库迁移
当 Entity Framework Code First 的数据模型发生改变时,默认会引发一个System.InvalidOperationException 的异常.解决方法是使用DropCrea ...
- MVC VS2012 Code First 数据库迁移教程
1.在“服务资源管理器”连接数据库 2.打开工具-Nuget程序包管理器“程序包管理器控制台” 3.控制台输入命令:PM> Enable-Migrations -StartUpProjectNa ...
- ASP.NET MVC 4下 Code First 数据库迁移
一.命令开启 1.打开控制台:视图->其他窗口->程序包管理器控制台: 2.启动数据库迁移,执行命令:enable-migrations 创建成功后会新增migrations目录等. 若 ...
- Code First数据库迁移
生成数据库 修改类文件PortalContext.cs的静态构造函数,取消当数据库模型发生改变时删除当前数据库重建新数据库的设置. PortalContext() { Database.SetInit ...
- EF Code First 数据库迁移Migration剖析
1.简介 Entity Framework 的Code First 方式,提供了一种方式:编写模型Model,生成模型变更,根据模型变更修改数据库. 而其所以来的环境就是强大的Nuget,如果还在是V ...
- [翻译][MVC 5 + EF 6] 5:Code First数据库迁移与程序部署
原文:Code First Migrations and Deployment with the Entity Framework in an ASP.NET MVC Application 1.启用 ...
- Asp.net Mvc Entity Framework Code First 数据库迁移
1.创建Mvc项目 2.安装Entity Framework 2.1.如下图打开程序包管理器控制台: 2.2.输入命令Install-Package EntityFramework,即可安装Entit ...
随机推荐
- RS485模块(485与TTL信号的转换)
1 综述 MAX3483, MAX3485, MAX3486, MAX3488, MAX3490以及MAX3491是用于RS-485与RS-422通信的3.3V,低功耗收发器,每个器件中都具有一个驱动 ...
- mysql 用sql语句查询一个表中的所有字段类型、注释
SELECT column_name,column_comment,data_type FROM information_schema.columns WHERE table_name='表名' AN ...
- 2.建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,
public class Bank { Double qian=0.0; double newBank(double a) { qian=qian+a; return qian; } double w ...
- FPM的远程利用
看了lijiejie的博客,和乌云的PHPFastCGI的这篇文章,感觉在实际的业务中经常能遇到,所以在此记录下来: 原文:http://www.lijiejie.com/fastcgi-read-f ...
- Shell概述
一,Shell原理
- JDBC操作Oracle数据库——实际操作过程中的小总结
1.对数据库中,表的每一行数据记录的增删改查 增:insert into 表名 values() 删:delete 表名 where 条件(id=?) 改:update 表名 set 列名=? whe ...
- CUBRID学习笔记 31 通过select创建表
语法 CREATE {TABLE | CLASS} <table_name> [( <column_definition> [,<table_constraint> ...
- 泛型IComparer<T>排序
class Program { static void Main(string[] args) { GetListTest(); } private static void GetListTest() ...
- SQL 语句集合
创建数据库 创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database ...
- mongoDB中的ID的生成原则