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.

questionAnswers(1)

yourAnswerToTheQuestion