Entity Framework Code-First Migrations - Nie można upuścić ograniczenia, ponieważ nie istnieje (konwencja nazewnictwa od 4.3 do 5.0)
Wcześniej korzystałem z EF 4.3 i po uaktualnieniu do wersji 5.0 dowiaduję się, że indeksy, ograniczenia FK i ograniczenia PK wszystkie mają swoje konwencje nazewnictwa zmienione na dbo (np. PK_Users stał się teraz PK_dbo.Users)
Teraz, kiedy tylko dokonam zmiany modelu i musi on zmienić tabelę, która w nim zawiera, zawsze mówi, że nie może upuścić ograniczenia, ponieważ nie może go znaleźć.
Po prostu chcę, aby po próbie usunięcia ograniczenia / indeksu / klucza najpierw sprawdzono, czy istnieje nazewnictwo przed 5.0, a jeśli tak, to upuść, ale nadal odtwarzaj je przy użyciu nowych konwencji nazewnictwa 5.0.
Konwencje nazewnictwa zmieniły się tak od 4.3 do 5.0:
Klucz podstawowy / indeksy
Old: PK_Users New: PK_dbo.Users
Klucz obcy
Old: FK_Users_Roles_Role_Id New: FK_dbo.Users_dbo.Roles_Role_Id
Uwaga: Nie mogę po prostu zregenerować EF wszystkich tabel, mam dane produkcyjne w tej bazie danych. Nie chcę też robić tego ręcznie dla każdej tabeli przy użyciu niestandardowych migracji.
Edytuj: znalazłem podobne pytanieJak mogę zatrzymać migracje Entity Framework 5 dodając dbo. na kluczowe nazwy? ale ten facet po prostu chciał zignorować konwencje 5.0 i trzymać się 4.3, a tylko zmienił nazwę tabeli. Wolałbym tego nie robić, ponieważ kolejne wersje EF mogą powodować więcej zmian, które wpłynęłyby na ten kod i po prostu byłyby kłopotliwe.
Próbowałem zrobić coś w tym samym duchu co odpowiedź:
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.", "");
}
}
I dodając go do konfiguracji:
public Configuration()
{
CodeGenerator = new CodeMigrator();
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
}
Jednak błąd nadal występuje:
dbo.Users_dbo.Departments_Department_Id 'nie jest ograniczeniem. Nie można upuścić ograniczenia. Zobacz poprzednie błędy.
Próbowałem zastąpić każdego członka wCSharpMigrationCodeGenerator
i ustawianie punktu przerwania w instrukcji powrotu, a żaden z nich nie trafi. Wygląda na to, że mój generator niestandardowy nigdy nie jest używany, nie jestem pewien, czego mi brakuje.