宝哥软件园

如何使用FluentMigrator实现数据库迁移

编辑:宝哥软件园 来源:互联网 时间:2021-08-26

FluentMigrator

Fluent Migrator是一个基于。NET,您可以像Ruby on Rails迁移一样使用它。Fluent Migrator的最新版本是3.13版本,官网地址是https://github.com/fluentmigrator/fluentmigrator.你不用写任何SQL脚本就可以用C#编写数据库迁移类。在用法上,与EF/EF Core的数据库迁移脚本非常相似,但支持的数据库类型比EF/EF Core多得多,而且不限于EF/EF Core。

支持的数据库列表

Microsoft SQL Server 2017 Microsoft SQL Server 2016 Microsoft SQL Server 2014 Microsoft SQL Server 2008 Microsoft SQL Server 2005 Microsoft SQL Server 2000 Microsoft SQL Server Compact Edition PostgreSQL MySQL 4 MySQL 5 Oracle(托管ADO.NET)Oracle(DotConnect ADO.NET)Microsoft jet engine(access)SQLite firebird Amazon红移sap HANA sap SQL anywhere DB2 iseries fluent Migrator提供了五个不同的类库来支持不同的场景。

包描述了FluentMigrator创建数据库所需的基本程序集。FluentMigrator所需的程序集。运行程序在进程内执行数据库迁移。它与兼容。 NET 4.0/4.5/。NET Core 2.0流畅迁移器。MSBuild与兼容。 NET 4.0/4.5/。NET标准2.0。FluentMigrator。的示例介绍。NET Core CLI工具,可执行数据库迁移。

在这里,我们首先演示一个最简单的数据库迁移示例,向MySql数据库添加一个日志表。

创建控制台程序

我们使用。NET Core CLI创建一个. NET Core命令行程序。

#迁移脚本基础库dotnet add package fluent Migrator #迁移脚本运行时dotnet add package fluent Migrator . runner #迁移脚本支持库dotnet add package fluent Migrator . runner . mysql # ADO.NET将第一个数据库迁移类添加到MySQL的驱动器dotnet add package MySQL中。数据

这里需要创建一个数据库迁移类,而不是创建一个名为Log的表

日志表中有两个字段,一个是标识字段,另一个是文本字段。Id字段是Int64类型的主键,自添加的Text字段是使用FluentMigrator的字符串字段。命名空间测试{[迁移(20180430121800)]公共类AddLogTable :迁移{公共覆盖void Up() { Create。表格('日志')。带列(' Id').AsInt64()。PrimaryKey()。身份()。带列(“文本”)。AsString();}公共覆盖void Down() { Delete。表格('日志');}}}运行迁移类

写完迁移类后,我们可以开始运行迁移类。

Fluent Migrator有两种运行迁移脚本的方法。

使用进程内执行器(推荐)使用进程外执行器使用进程内执行器

所谓进行中的执行器,其实就是在程序中手动调用IMigrationRunner接口对象的MigrateUp方法,在FluentMigrator的帮助下执行数据库迁移。跑步者图书馆。

在这里,我们可以如下修改Program.cs文件。

程序类{ static void Main(string[]args){ var service provider=CreateServices();使用(var scope=serviceProvider。CreateScope()) { UpdateDatabase(作用域。service provider);} } private static is erviceprovider create services(){返回新的服务集合()//添加Fluent Migrator basic service . addfluent Migrator()。ConfigureRunner(rb=rb //添加MySql 5.0支持。AddMySql5() //配置连接字符串。with globalconnectionstring(' server=localhost;port=3307数据库=abcUID=根;PWD=123456') //检索迁移配置。scan in(addlogtable的类型)。装配)。为了。migrations())//启用控制台日志。添加日志记录(lb=lb。addfluent Migrator console())//生成服务提供程序。BuildServiceProvider(false);}私有静态void update数据库(iserviceprovider服务提供程序){//初始化进程内迁移生成器varrunner=service provider . getrequiredservicemigrationrunner();//执行迁移脚本运行程序。migratePu();}}启动程序后,迁移会自动完成。

使用进程外执行器

如果您想要使用外部迁移执行器,您需要确保您已经安装了的SDK。NET Core 2.1或更高版本,因为您需要在之后使用新的全局工具功能。NET核心2.1。

在这里,我们可以使用命令行添加工具FluentMigrator。DotNet.Cli

dot net工具安装后-g流畅迁移器。安装了dot net.cli后,我们可以使用这个工具来做数据库迁移

dotnet FM migrate-p MySQL-c ' server=localhost;port=3307数据库=abcUID=根;Pwd=123456' -a '。' bin debug netcore app 2.1 test . dll '此方法有三个参数,第一个参数-p指定数据库的类型,第二个参数-c指定连接字符串,第三个参数-a指定包含迁移类的程序集路径。

注意:其实还有第四个参数命令,可以选择向下/向上。如果未指定,默认值为up,即所有尚未运行的数据库迁移类都将运行。

方法执行后,效果与进程内执行器一致。

基本概念

在展示了一个简单的例子之后,让我们来看看Fluent Migrator中的一些基本概念。

迁移(迁移)

Fluent Migrator中最基本的元素是迁移类。每个迁移类都需要继承一个名为migration的抽象类,并实现两个抽象方法Up和Down。顾名思义,Up方法执行当前的数据库更改,Down方法回滚当前的数据库更改。

[迁移(1)]公共类CreateUserTable :迁移{公共覆盖void Up() {创建。表格('用户');}公共覆盖void Down() { Delete。表格('用户');}}在这里,你可能会注意到migration类的头部有一个migration的特性,它的值是1,实际上是指定了migration类的执行顺序,数字越小,migration类执行的越早(有些开发人员会以当前日期的yyyyMMddHHmmss的格式来标记Migration类)。此号码必须是唯一的,不能重复。

流畅界面(流畅界面)

Fluent Migrator提供了丰富的fluent api,可以用来创建表、列和索引。基本上,它支持您可以使用的大多数场景。

创建表达式(创建表达式)

您可以使用它创建表达式来添加表、列、索引、外键和组织结构

创造。表格('用户')。WithIdColumn()。带列('名称')。AsString()。NotNullable();注意:WithIdColumn()是一个扩展方法,相当于。带列(' id ')。asint32()。notnullable()。primarykey()。identity();

创造。ForeignKey()。从表('用户')。ForeignColumn('CompanyId ')。ToTable('公司')。PrimaryColumn(' Id ');更改表达式(更改表达式)

用于更改现有的表和行

改变。表格(“栏”)。添加列(' SomeDate ')。AsDateTime()。可空();改变。表格(“栏”)。AlterColumn('SomeDate ')。AsDateTime()。NotNullable();改变。列(' SomeDate ')。表格('栏')。AsDateTime()。NotNullable();删除表达式(删除表达式)

用于删除表、列、外键和组织架构

删除。表格('用户');删除多列(删除多列)

Fluent Migrator还提供了删除多列的语法

删除。列(' AllowSubscription ')。列('订阅日期')。从表('用户');执行脚本(执行表达式)

允许您执行自定义的SQL脚本或执行指定的SQL脚本文件

执行。脚本(' myscript . SQL ');执行。embedded script(' updatelegacysp . SQL ');执行。SQL(' DELETE TABLE Users ');这里的EmbeddedScript方法也执行指定的SQL脚本文件,但是它的文件是从嵌入式资源中读取的。如果要使用EmbbedScript,只需将指定SQL脚本文件的“生成操作”属性设置为嵌入资源。

重命名表达式(重命名表达式)

允许重命名表或列

重命名。表格('用户')。收件人('新用户');重命名。列('姓氏')。联系人(“用户”)。至('姓');数据操作表达式(数据表达式)

允许添加/修改/删除数据库数据

插入。输入表格(“用户”)。Row(new { FirstName='John ',last name=' Smith ' });删除。从表('用户')。AllRows();//删除所有行删除。fromtable ('users ')。row(new { first name=' John ' });//删除所有FirstName=John delete的数据线。fromtable ('users ')。isnull('用户名');//删除Username,update.table ('users ')为空的所有数据行。set (new {name=' John'})。其中(new { name=' Johanna ' });数据库类型判断表达式

允许根据数据库类型执行不同的数据库迁移操作

IfDatabase('SqlServer ',' Postgres') .Create.Table('Users ')。WithIdColumn()。带列('名称')。AsString()。NotNullable();IfDatabase(' Sqlite '). create . table(' Users ')。带列(' Id').AsInt16()。PrimaryKey()。带列('名称')。AsString()。NotNullable();组织结构存在表达式(架构。existexpressions)

用于判断组织结构是否已经存在,比如判断表是否存在,列是否存在等等。

if(!模式。表格('用户')。列('名字')。Exists()){ this。创建. Column('名字')。联系人(“用户”)。阿桑斯汀(128)。可空();}配置(配置文件)

流畅迁移器还提供了配置文件功能。通过这种配置,开发人员可以针对不同的环境(开发环境、测试环境、生产环境等)运行不同的脚本。).

[配置文件('开发')]公共类CreateDevSeedData :迁移{公共覆盖void Up() {插入。输入表格(“用户”)。行(新的{用户名='devuser1 ',显示名称=' Dev User ' });{ public override void down(){//空,不使用}}和EF/EF Core之间的脚本迁移比较

Fluent Migrator的数据库脚本迁移与EF/EF Core非常相似。

相似之处:

当我们使用EF/EF Core进行数据库迁移时,我们会在当前数据库中创建一个_ _ EFMigrationsHistory表,并将运行脚本Id保存在其中。当我们使用Fluent Migrator进行数据库迁移时,我们还会在数据库中创建一个VersionInfo表,并将运行脚本Id :的差异保存在其中

EF/EF Core的迁移脚本是根据EF上下文配置和最新的ModelSnapshot自动生成的,更加方便。Fluent Migrator的迁移脚本需要手动编写,更加灵活。EF/EF Core自动生成的每个迁移文件都是cs文件和Design.cs文件。每个cs文件包含自动生成的脚本类,Design.cs包含当前迁移类的最新ModelSnapshot。因此,如果大量使用EF/EF Core,最终生成的Design.cs文件会非常大。Fluent Migrator的每个迁移类都是自己编写的,只包含本次迁移的内容,所以体积比较小。摘要

在本文中,我描述了Fluent Migrator的一些基本用途,以及Fluent Migrator和EF/EF Core脚本迁移的区别。如果你不是重度EF/EF Core的用户,可以尝试使用fluent Migrator做数据库迁移。

好了,这就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。

更多资讯
游戏推荐
更多+