当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数据库迁移的更多相关文章

  1. Entity Framework 5.0系列之Code First数据库迁移

    我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...

  2. Code First 数据库迁移

    当 Entity Framework Code First 的数据模型发生改变时,默认会引发一个System.InvalidOperationException 的异常.解决方法是使用DropCrea ...

  3. 使用 Code First 数据库迁移

    当 Entity Framework Code First 的数据模型发生改变时,默认会引发一个System.InvalidOperationException 的异常.解决方法是使用DropCrea ...

  4. MVC VS2012 Code First 数据库迁移教程

    1.在“服务资源管理器”连接数据库 2.打开工具-Nuget程序包管理器“程序包管理器控制台” 3.控制台输入命令:PM> Enable-Migrations -StartUpProjectNa ...

  5. ASP.NET MVC 4下 Code First 数据库迁移

     一.命令开启 1.打开控制台:视图->其他窗口->程序包管理器控制台: 2.启动数据库迁移,执行命令:enable-migrations 创建成功后会新增migrations目录等. 若 ...

  6. Code First数据库迁移

    生成数据库 修改类文件PortalContext.cs的静态构造函数,取消当数据库模型发生改变时删除当前数据库重建新数据库的设置. PortalContext() { Database.SetInit ...

  7. EF Code First 数据库迁移Migration剖析

    1.简介 Entity Framework 的Code First 方式,提供了一种方式:编写模型Model,生成模型变更,根据模型变更修改数据库. 而其所以来的环境就是强大的Nuget,如果还在是V ...

  8. [翻译][MVC 5 + EF 6] 5:Code First数据库迁移与程序部署

    原文:Code First Migrations and Deployment with the Entity Framework in an ASP.NET MVC Application 1.启用 ...

  9. Asp.net Mvc Entity Framework Code First 数据库迁移

    1.创建Mvc项目 2.安装Entity Framework 2.1.如下图打开程序包管理器控制台: 2.2.输入命令Install-Package EntityFramework,即可安装Entit ...

随机推荐

  1. response.sendRedirect()重新定向的乱码问题

    这里response.sendRedirect("YPbianhaoModify.jsp?jinhuoshang="+jinhuoshang+"&jinhuori ...

  2. C#窗体截屏,简单例子

    private void button1_Click(object sender, EventArgs e) { Rectangle rect = System.Windows.Forms.Syste ...

  3. eclipse 恢复SVN无法还原的文件 svn使用了还原,但本地的没有提交找回没提交代码的方法

    http://blog.sina.com.cn/s/blog_750167060102vd2n.html

  4. 【leetcode❤python】119. Pascal's Triangle II

    #-*- coding: UTF-8 -*-#杨辉三角返回给定行#方法:自上而下考虑问题,从给定的一行计算出下一行,则给定行数之后,计算的最后一行就是求解的最后一行class Solution(obj ...

  5. UVA 1424 二 Salesmen

    Salesmen Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Pr ...

  6. Cheatsheet: 2015 01.01~ 01.31

    JAVA JVM Architecture Improving Lock Performance in Java 10 Best Java Tools That Every Java Programm ...

  7. jquery之 animate()方法详解

    jQuery.animate() 函数详解 animate()函数用于执行一个基于css属性的自定义动画. 你可以为匹配的元素设置css样式,animate()函数将会执行一个从当前样式到指定的css ...

  8. 从原理上搞定编码-- Base64编码

    BASE64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据.这是一种可逆的编码方式.编码后的数据是一个字符串,其中包含的字符为:A-Z.a-z.0-9.+./共64个字符:26 + 2 ...

  9. FreeSWITCH第三方库(视频)的简单介绍(二)

    FreeSWITCH使用了大量的第三方库,本文档主要介绍视频相关库的信息: 音频相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5486753.html 其他相关 ...

  10. hdu 5943 Kingdom of Obsession 二分图匹配+素数定理

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...