首页
学习
活动
专区
工具
TVP
发布

入门湿货(三)数据库迁移

前面介绍的文章中,在简单示例中提到了通过初始化器,来更改数据库模式。但是实际生产环境中,几乎所有数据库初始化器都不现实,因为实际生产环境中的数据是很宝贵的。

这种情况下,Entity Framework中的数据库迁移,就是很有必要的功能了。前面在入门干货里有提到数据库迁移的一些常用命令,这里我们除了那么常用命令外,再介绍一下自动迁移、显式迁移、对已存在的数据库添加迁移。

首先,先把EF数据库迁移常用的脚本命令列出来:

Add-Migration新建数据库迁移脚本

Enable-Migrations给项目启动数据库迁移

Get-Help帮助命令

Update-Database[-Script] 更新数据库命令 [生成脚本参数]

Enable-Migrations命令

打开Nuget包管理控制台窗口,默认项目选择数据库上下文Context类所在的类库项目,然后在窗口中输入Enable-Migrations,最后按下Enter键即可给项目启动数据库迁移。

运行该命令后,我们会看到项目中多了一个名叫Migrations的文件夹,该文件夹里面有一个类Configuration,它指定了迁移配置,通过泛型参数将它连接到我们的数据库上下文类。

关于自动迁移

在启动了数据库迁移的项目迁移配置Configuration类的构造函数中,默认设置了AutomaticMigrationsEnabled=false,将AutomaticMigrationsEnabled修改为true,即开启了自动迁移。这样实体对象变更、数据库上下文变更之后,在运行程序时,就自动更新数据库了。

另外如果你们公司有DBA之类的管理者,需要审查我们的数据库升级脚本,自动迁移功能就派上用场了。操作步骤如下:

1)给项目开启数据库迁移功能。

2)设置自动迁移。

3)在Nuget包管理控制台窗口,输入update-database -script回车。

4)我们就能看到脚本在vs中打开。

但是自动迁移也是有弊端的,在一些简单的情景下面,自动迁移很好用,可以作为推荐使用的功能,但是当迁移变的复杂的时候,自动迁移就不好用了。这个时候我们就需要切换回显式迁移了。

关于显式迁移

显式迁移要比自动迁移灵活,虽然得敲较多的代码,但是为了更好的控制权,也是值得的。

首先,显式迁移需要确定AutomaticMigrationsEnabled属性为false,否则在两种迁移模式下,混乱就是很正常的了。

这个时候,就会用到上面的Add-Migration命令了。

Add-Migration命令

参数:迁移类名称。

运行该命令后,项目Migrations文件夹中,会生成该次迁移对应的迁移类,文件名以迁移创建的时间为前缀。

通过迁移类中的代码,我们能看出,EF自动使用 DbMigration基类帮我们实现了迁移,并重写了Up和Down方法。Up方法将数据库结构向前推进,Down方法实现回滚到之前的数据库结构。

现在使用Update-Database命令,我们会发现,数据库里除了我们更新实体引起的变动外,还会发现一张名为“__MigrationHistory”的表。该表是用来记录迁移历史的,不进行详细介绍了。

关于对已存在的数据库添加迁移

如果我们需要为一个已存在的数据库添加EF迁移,由于数据库已存在于生产环境,所以需要先让迁移知道起始的已知状态。使用命令Add-Migration -IgnoreChanges来进行处理。

执行该命令时,EF会创建一个空的迁移,假设上下文、实体定义的模型和数据库是兼容的,然后数据库模式不会发生变化,但是在__MigrationHistory表中添加一条新的数据来对应初次迁移。这之后,我们就可以切换到EF的迁移API来维护数据库模式变化了。

最后,简单提一下如果想给已创建的数据库创建实体类,可以使用Entity Framework Power Tools插件,或Entity Framework Tools工具。

插件/工具下载地址:

Entity Framework Power Tools插件

https://marketplace.visualstudio.com/items?itemName=EntityFrameworkTeam.EntityFrameworkPowerToolsBeta4

Entity Framework Tools工具

https://www.microsoft.com/en-us/download/details.aspx?id=40762

相关内容,有兴趣的同学,自行研究吧。

好了,Entity Framework的相关入门内容就介绍到这里。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180423G0Z29M00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券