Migração do Code-First do Entity Framework - Não é possível eliminar a restrição porque ela não existe (convenção de nomenclatura de 4.3 para 5.0)
Anteriormente, estava usando o EF 4.3 e, ao atualizar para 5.0, descobri que os índices, as restrições FK e as restrições PK tiveram suas convenções de nomenclatura alteradas para incluir dbo (por exemplo, PK_Users agora se tornou PK_dbo.Users)
Agora, toda vez que eu faço uma mudança no modelo e ele precisa mudar uma tabela que contém isso, ele sempre diz que não pode eliminar a restrição porque não consegue encontrá-la.
Eu apenas quero que quando ele tenta eliminar uma restrição / índice / chave primeiro verifique se existe uma nomenclatura pré-5.0 e, se for, solte-a, mas ainda a recrie usando as novas convenções de nomenclatura 5.0.
As convenções de nomenclatura mudaram assim de 4.3 para 5.0:
Chave primária / índices
Old: PK_Users New: PK_dbo.Users
Chaves Estrangeiras
Old: FK_Users_Roles_Role_Id New: FK_dbo.Users_dbo.Roles_Role_Id
Nota: NÃO POSSO simplesmente ter o EF regenerar todas as tabelas, tenho dados de produção neste banco de dados. Eu também não quero ter que fazer isso manualmente para cada tabela usando migrações personalizadas.
Edit: eu encontrei uma pergunta semelhanteComo posso parar as migrações do Entity Framework 5 adicionando o dbo. em nomes-chave? mas esse cara só queria ignorar as convenções 5.0 e ficar com o 4.3, e tratava apenas de renomear tabelas. Eu preferiria não fazer isso, pois versões subsequentes do EF podem causar mais alterações que afetariam esse código e seriam apenas um aborrecimento.
Eu tentei fazer algo na mesma linha que a resposta postada:
public class CodeMigrator : CSharpMigrationCodeGenerator
{
protected override void Generate(
DropIndexOperation dropIndexOperation, IndentedTextWriter writer)
{
dropIndexOperation.Name = StripDbo(dropIndexOperation.Name);
base.Generate(dropIndexOperation, writer);
}
protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation, IndentedTextWriter writer)
{
dropForeignKeyOperation.Name = StripDbo(dropForeignKeyOperation.Name);
base.Generate(dropForeignKeyOperation, writer);
}
protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation, IndentedTextWriter writer)
{
dropPrimaryKeyOperation.Name = StripDbo(dropPrimaryKeyOperation.Name);
base.Generate(dropPrimaryKeyOperation, writer);
}
// TODO: Override other Generate overloads that involve table names
private string StripDbo(string name)
{
return name.Replace("dbo.", "");
}
}
E adicionando-o à configuração:
public Configuration()
{
CodeGenerator = new CodeMigrator();
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
}
No entanto, o erro ainda é atingido:
dbo.Users_dbo.Departments_Department_Id 'não é uma restrição. Não foi possível eliminar a restrição. Veja os erros anteriores.
Eu realmente tentei substituir cada membro noCSharpMigrationCodeGenerator
e definindo um ponto de interrupção na instrução de retorno, e nenhum deles foi atingido. Então parece que meu gerador personalizado nunca é usado, não tenho certeza do que estou perdendo com isso.