文章内容

2017/1/3 10:54:21,作 者: 黄兵

Entity Framework数据库迁移

现在我们准备创建数据库了,如果在本地工作,只是创建或者更新本地数据库,那么我们在包管理器控制台中执行Update-Database命令,还有,可以使用Get-Help命令查看可以使用的参数(后面不再啰嗦这个命令)。下面,我们对-script参数感兴趣,该参数很有用,因为它可以生成迁移的SQL脚本,我们可以将该脚本交给DBA或者我们自己运行。当运行Update-Database命令时,它会比较实体类、上下文创建的数据库和物理数据库的结构。运行该命令之后:


该错误是告诉我们应该启用自动迁移生成,就像错误提示的那样,将配置类中的AutomaticMigrationsEnabled = false;设置为true,生成解决方案,再次运行生成脚本的命令。我们会看到生成的脚本会在VS中打开,然后可以通过运行该脚本生成目标数据库。当我们和DBA共事时,他需要复审我们的升级脚本,这个功能就派上用场了。如果我们只是创建本地数据库的话,只需要运行Update-Database,无需带任何参数。运行之后,打开数据库,发现已经创建了新的数据库。

使用迁移API

假如我还要给Comment实体添加一个非空的创建时间CreationTime属性:
public DateTime CreationTime { get; set; }
我想要这个新列的默认值为当前插入数据的日期。如果就这样更新数据库的话,会发现该列的值是1900/1/1。很显然,我们并不需要这样的值,因此,这个时候就需要我们切换到显式迁移了。一般来说,显式迁移比自动迁移更加灵活,虽然需要写更多的代码,但是对于迁移有了更多控制权,比如迁移名称和回滚过程等等。如果我们混用了自动迁移和显式迁移,就会把自己搞糊涂。比如,必须通过搜索项目来检查列是否通过自动迁移或手动迁移添加了。因此,为了提供一致性和维护目的,我们需要标准化显式迁移,此时,我们应该关闭自动迁移。

开始显式迁移之前,先要删除刚才SSMS中创建的数据库,然后使用迁移配置类中AutomaticMigrationsEnabled = false;关闭自动迁移。要创建初始化数据库迁移,需要使用新的命令Add-Migration,如下所示:


生成的代码如下:


InitialMigration只是一个迁移名称,可以随便起名字。这条指令会在Migrations文件夹中添加一个新类。物理文件会被命名为类似 201701030234368_2017-01-03的东西,文件名以迁移创建的时间为前缀,便于我们在文件夹中组织迁移。生成的代码如上图所示。


进一步看一下生成的代码,EF自动使用DbMigration基类帮我们实现了自己的迁移,重写了UpDown方法。Up方法将数据库结构向前移动,例如,我们这里创建了两张新的表;Down方法帮助我们撤销更改,以防我们发现了软件问题需要回滚到之前的数据库结构。现在使用Update-Database命令更新数据库,我们会发现数据库中多了两张新表。

再仔细看的话,会发现多了一张不是我们创建的表,如下所示:

分享到:

发表评论

评论列表