Erro do EF Migrations ao atualizar o Database no SQL Azure

Ao executar o comando update-database via Migrations do EF CodeFirst para atualizar um database hospedado no SQL Azure você pode receber uma mensagem de erro:

Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.

Pesquisando sobre o erro descobri que é um bug já reportado do EF 6 Alfa 3.
O motivo apresentado por Andrew Peters (EF Developer) foi:

This causes Migrations not to work on Azure because the history table needs at least one clustered PK

Como resolver:

1- Atualize a versão da biblioteca do EF 6 (a correção foi disponibilizada em 07/03/2013).

2 -Caso não seja possível a atualização da biblioteca, existe um workaround:

Crie uma classe de custom migration SQL generator

using System.Data.Entity.Migrations.Model;
using System.Data.Entity.Migrations.Sql;

public class AzureSqlGenerator : SqlServerMigrationSqlGenerator
{
    protected override void Generate(CreateTableOperation createTableOperation)
    {
        if ((createTableOperation.PrimaryKey != null)
            && !createTableOperation.PrimaryKey.IsClustered)
        {
            createTableOperation.PrimaryKey.IsClustered = true;
        }

        base.Generate(createTableOperation);
    }
}

E registre a sua custom generator no arquivo Configuration.cs da pasta Migrations

internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;

        // Esta linha abaixo:
        SetSqlGenerator("System.Data.SqlClient", new AzureSqlGenerator());
    }

    protected override void Seed(MyContext context)
    {
    }
}

Pronto!
Pode rodar novamente o comando update-database que o problema estará resolvido.

Até a próxima 😉

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *