Por fim, vamos criar a primeira versão da migração com a tabela de exemplo e suas colunas correspondentes.

Versão Base

Para evitar a duplicação de código, vamos criar uma versão base.

No diretório Migrations/, crie a classe VersaoBase:

public class VersaoBase
{
    // Este é um método estático chamado InserirColunasPadrao. 
    // Ele recebe um parâmetro do tipo ICreateTableWithColumnOrSchemaOrDescriptionSyntax chamado 'tabela'.
    public static ICreateTableColumnOptionOrWithColumnSyntax InserirColunasPadrao(ICreateTableWithColumnOrSchemaOrDescriptionSyntax tabela)
    {
        // Aqui, estamos adicionando colunas à tabela passada como parâmetro.
        // A coluna "Id" é do tipo Int64, é a chave primária e é autoincrementada.
        // A coluna "DataCriacao" é do tipo DateTime e não pode ser nula.
        return tabela
        .WithColumn("Id").AsInt64().PrimaryKey().Identity()
        .WithColumn("DataCriacao").AsDateTime().NotNullable();
    }
}

Ao criar novas versões, utilizamos o método acima, passando o tipo que recebe e o nome da tabela a ser criada.

Enum

Também vamos criar um Enum com os números das versões para passar via atributo, juntamente com a descrição.

No diretório Migrations/, adicione:

public enum NumeroVersoes
{
    CriarTabelaAdmin = 1
}

Primeira versão

No diretório Migrations/Versoes, crie a classe Versao0000001.

Observação: Para padronizar as versões utilize o nome “Versao” + 000000 + Número da versão

A classe deve herdar de Migration e sobrescrever seus métodos:

public class Versao0000001 : Migration
{
    public override void Down() { }
 
    public override void Up() { }
}

Vamos criar a tabela utilizando a versão base e passando o Create.Table( ) com o nome da tabela como parâmetros:

public class Versao0000001 : Migration
{
    public override void Down() { }
 
    public override void Up()
    {
        var tabela = VersaoBase.InserirColunasPadrao(Create.Table("Admins"));
    }
}

Agora, vamos adicionar as respectivas colunas:

public class Versao0000001 : Migration
{
    public override void Down() { }
 
    public override void Up()
    {
        var tabela = VersaoBase.InserirColunasPadrao(Create.Table("Admins"));
 
        tabela
            .WithColumn("Nome").AsString(100).NotNullable()
            .WithColumn("Email").AsString().NotNullable()
            .WithColumn("Senha").AsString(2000).NotNullable()
            .WithColumn("Telefone").AsString(14).NotNullable()
            .WithColumn("Administrador").AsBoolean().WithDefaultValue(true).NotNullable();
    }
}

Lembre-se de passar o atributo com o número da versão e a descrição:

[Migration((long)NumeroVersoes.CriarTabelaAdmin, "Cria tabela admin")]
public class Versao0000001 : Migration
{
    public override void Down() { }
 
    public override void Up()
    {
        var tabela = VersaoBase.InserirColunasPadrao(Create.Table("Admins"));
 
        tabela
            .WithColumn("Nome").AsString(100).NotNullable()
            .WithColumn("Email").AsString().NotNullable()
            .WithColumn("Senha").AsString(2000).NotNullable()
            .WithColumn("Telefone").AsString(14).NotNullable()
            .WithColumn("Administrador").AsBoolean().WithDefaultValue(true).NotNullable();
    }
}

Pronto! Ao executar o projeto, as migrações serão geradas no banco de dados. Sempre que o projeto for iniciado, será verificado se existem migrações pendentes.

Projeto de exemplo