O Entity Framework cria migração vazia, mas insiste que meu modelo é diferente
Hoje é um dia triste. A primeira coisa que vi hoje foi a exceção da EF dizendo que "O modelo que suporta o contexto 'DomainContext' mudou desde que o banco de dados foi criado.". É quase meia-noite e ainda vejo esse erro. Este é o fim da minha carreira - (
Tenho certeza de que nada mudou no modelo, mas o erro apareceu. Eu tentei criar uma nova migração, ela saiu vazia:
public void Up()
{
}
public void Down()
{
}
A aplicação dessa migração não foi boa - o erro persistiu. Usei a sugestão comum para definir o inicializador como nulo:
Database.SetInitializer<DomainContext>(null);
E cometeu o erro desaparecer ao acessar o banco de dados. Mas isso me incomoda muito - sempre que tento executar migrações por código, vejo erros semelhantes novamente:
var configuration = new Migrations.Configuration();
configuration.TargetDatabase = new DbConnectionInfo("correct connection string", "System.Data.SqlClient");
var migrator = new DbMigrator(configuration);
migrator.Update(); // <<-- exception is thrown here
O lançamento de exceção é assim:System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException: Não foi possível atualizar o banco de dados para corresponder ao modelo atual porque há alterações pendentes e a migração automática está desabilitada. Escreva as alterações de modelo pendentes em uma migração baseada em código ou ative a migração automática. Defina DbMigrationsConfiguration.AutomaticMigrationsEnabled como true para ativar a migração automática.
Atualizei para o EF 6.1 (estava na 6.0.2 antes), mas isso não fez diferença.
Outra coisa que me incomoda é que eu posso executar migrações através do Nuget Console:
Update-Database
Funciona bem e não apresenta problemas. Mas quando defino o inicializador de banco de dados para executar migrações automaticamente:
var initializer = new MigrateDatabaseToLatestVersion<DomainContext, Migrations.Configuration>();
Database.SetInitializer(initializer);
var domainContext = new DomainContext();
domainContext.Database.Initialize(true); // <<-- this throws exception
Não foi possível atualizar o banco de dados para corresponder ao modelo atual porque há alterações pendentes e a migração automática está desabilitada. Escreva as alterações de modelo pendentes em uma migração baseada em código ou ative a migração automática. Defina DbMigrationsConfiguration.AutomaticMigrationsEnabled como true para ativar a migração automática.
A verdadeira questão é por que o EF possui hashes diferentes para modelos ao executar no console Nuget e no inicializador de banco de dados de migração? Como posso descobrir o que é diferente (modelo do db-state)? E como consertar isso, para não precisar usar hacks (atribuir nulo ao db-initaliser)?