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(5)]
        public string Name { get; set; }

        [MaxLength(200)]
        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(5)]
        public string Name { get; set; }

        [MaxLength(200)]
        public string Email { get; set; }

        [Required]
        [MaxLength(16)]
        public string Username { get; set; }

        [Required]
        [MaxLength(40)]
        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

posted @ 2015-10-09 09:10  RunningYY  阅读(781)  评论(1编辑  收藏  举报