Entity Framework Code-First Migrations - Невозможно удалить ограничение, потому что оно не существует (соглашение об именах от 4.3 до 5.0)
Ранее использовал EF 4.3 и после обновления до 5.0 я обнаружил, что для индексов, ограничений FK и ограничений PK все соглашения об именах были изменены, чтобы включить dbo (например, PK_Users теперь стал PK_dbo.Users)
Теперь, когда я делаю изменения в модели, и ей нужно изменить таблицу, в которой они есть, она всегда говорит, что не может снять ограничение, потому что не может его найти.
Я просто хочу, чтобы, когда он пытается удалить ограничение / индекс / ключ, он сначала проверяет, существует ли имя, предшествующее 5.0, и, если это так, удаляет его, но все же воссоздает его, используя новые соглашения об именах 5.0.
Соглашения об именах изменились так с 4.3 до 5.0:
Первичный ключ / индексы
Old: PK_Users New: PK_dbo.Users
Иностранные ключи
Old: FK_Users_Roles_Role_Id New: FK_dbo.Users_dbo.Roles_Role_Id
Примечание: Я НЕ МОГУ просто заставить EF восстановить все таблицы, у меня есть производственные данные в этой базе данных. Я также не хочу делать это вручную для каждой таблицы с помощью пользовательских миграций.
Изменить: я нашел похожий вопросКак я могу остановить миграции Entity Framework 5, добавив dbo. в ключевые имена? но этот парень просто хотел игнорировать соглашения 5.0 и придерживаться 4.3, и это касалось только переименования таблиц. Я бы предпочел не делать этого, так как последующие версии EF могут вызвать больше изменений, которые повлияют на этот код и будут просто хлопотами по линии.
Я попытался сделать что-то в том же духе, что и ответ на вопрос:
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.", "");
}
}
И добавив его в конфиг:
public Configuration()
{
CodeGenerator = new CodeMigrator();
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
}
Однако ошибка все еще поражает:
dbo.Users_dbo.Departments_Department_Id 'не является ограничением. Не удалось отбросить ограничение. Смотрите предыдущие ошибки.
Я на самом деле пытался переопределить каждый член вCSharpMigrationCodeGenerator
и установка точки останова в операторе возврата, и ни один из них не срабатывает. Так что, похоже, мой генератор никогда не привыкнет, не знаю, чего мне не хватает в этом.