在FluentMigrator上创建表之前检查表是否存在

时间:2016-03-02 12:29:14

标签: c# .net migration fluent-migrator

我正在寻找一种方法来在创建表之前为流畅的迁移器检查编写扩展方法,类似这样

Schema.TableIfNotExist("table").InSchema("dbo").WithColumn("Id").AsInt32().NotNullable()

是否可以编写扩展方法?

1 个答案:

答案 0 :(得分:5)

是的,你可以

public static class Ex
{
    public static IFluentSyntax CreateTableIfNotExists(this MigrationBase self, string tableName, Func<ICreateTableWithColumnOrSchemaOrDescriptionSyntax, IFluentSyntax> constructTableFunction, string schemaName = "dbo")
    {
        if (!self.Schema.Schema(schemaName).Table(tableName).Exists())
        {
            return constructTableFunction(self.Create.Table(tableName));
        }
        else
            return null;
    }
}

你将有两个警告(我知道):

  1. 如果您在同一个迁移中多次调用该函数,则第一个将执行 成功,其他人会失败,因为存在检查需要 要使用新表更新的模式上下文 在下次迁移之前(或直到当前迁移成功执行)才会发生。
  2. 如果您使用AutoReversingMigrations,则表达式不会 自动映射到其相应的向下状态。含义 暗示下来不会产生任何影响。
  3. 要使用上面的扩展和你的例子,你会做

    public override void Up()
    {
        this.CreateTableIfNotExists("table", table => table.WithColumn("Id").AsInt32().NotNullable());
    }