如何利用FluentMigrator实现数据库迁移(2)

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

[Migration(1)] public class CreateUserTable : Migration { public override void Up() { Create.Table("Users"); } public override void Down() { Delete.Table("Users"); } }

这里你可能注意到迁移类的头部,有一个Migration的特性,它的值是1, 这里其实是指定了迁移类执行的顺序,编号越小的迁移类越先执行(有一部分开发人员系统会使用当前日期的yyyyMMddHHmmss格式来标记迁移类),这个编号必须是唯一的,不能重复。

Fluent接口(Fluent Interface)

Fluent Migrator提供非常丰富的fluent api, 我们可以使用这些api来创建表,列,索引。 基本上你能用到的大部分场景它都支持。

创建表达式(Create Expression)

你可以使用它创建表达式来添加表,列,索引,外键,组织结构(schema)

Create.Table("Users") .WithIdColumn() .WithColumn("Name").AsString().NotNullable();

注:WithIdColumn()是一个扩展方法,它等价于.WithColumn("Id").AsInt32().NotNullable().PrimaryKey().Identity();

Create.ForeignKey() .FromTable("Users").ForeignColumn("CompanyId") .ToTable("Company").PrimaryColumn("Id");

变更表达式(Alter Expression)

用来变更已存在的表和列

Alter.Table("Bar") .AddColumn("SomeDate") .AsDateTime() .Nullable();

Alter.Table("Bar") .AlterColumn("SomeDate") .AsDateTime() .NotNullable();

Alter.Column("SomeDate") .OnTable("Bar") .AsDateTime() .NotNullable();

删除表达式(Delete Expression)

用来删除表,列,外键,组织结构(Schema)

Delete.Table("Users");

删除多个列(Delete Multiple Columns)

Fluent Migrator也提供了一个删除多列的语法

Delete.Column("AllowSubscription").Column("SubscriptionDate").FromTable("Users");

执行脚本(Execute Expression)

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

Execute.Script("myscript.sql"); Execute.EmbeddedScript("UpdateLegacySP.sql"); Execute.Sql("DELETE TABLE Users");

这里EmbeddedScript方法也是执行指定的SQL脚本文件,但是它的文件来源Embbed Resource中读取。如果你想使用EmbbedScript只需要将指定的SQL脚本文件的Build Action属性设置为Embbed Resource即可。

重命名表达式(Rename Expression)

允许重命名表或列

Rename.Table("Users").To("UsersNew"); Rename.Column("LastName").OnTable("Users").To("Surname");

数据操作表达式(Data Expressions)

允许对数据库数据进行新增/修改/删除操作

Insert.IntoTable("Users").Row(new { FirstName = "John", LastName = "Smith" });

Delete.FromTable("Users").AllRows(); //删除所有行 Delete.FromTable("Users").Row(new { FirstName = "John" }); //删除所有FirstName = John的数据行 Delete.FromTable("Users").IsNull("Username"); //删除所有Username为空的数据行

Update.Table("Users").Set(new { Name = "John" }).Where(new { Name = "Johnanna" });

数据库类型判断表达式(IfDatabase Expression)

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

IfDatabase("SqlServer", "Postgres") .Create.Table("Users") .WithIdColumn() .WithColumn("Name").AsString().NotNullable(); IfDatabase("Sqlite") .Create.Table("Users") .WithColumn("Id").AsInt16().PrimaryKey() .WithColumn("Name").AsString().NotNullable();

组织结构存在表达式(Schema.Exists Expressions)

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

if (!Schema.Table("Users").Column("FirstName").Exists()) { this.Create.Column("FirstName").OnTable("Users").AsAnsiString(128).Nullable(); }

配置(Profile)

Fluent Migrator还提供了一个Profile的特性,使用该配置,开发人员可以对针对的不同的环境(开发环境,测试环境,生产环境等)运行不同的脚本。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdszsd.html