Code-First-Migrationen von Entity Framework - Einschränkung kann nicht gelöscht werden, da sie nicht vorhanden ist (Namenskonvention von 4.3 bis 5.0)

War zuvor mit EF 4.3 und beim Upgrade auf 5.0 habe ich herausgefunden, dass die Namenskonventionen der Indizes, FK-Einschränkungen und PK-Einschränkungen geändert wurden, um dbo einzuschließen (z. B. PK_Users wurde jetzt zu PK_dbo.Users).

Jedes Mal, wenn ich das Modell ändere und eine Tabelle mit diesen Daten geändert werden muss, wird immer angegeben, dass die Einschränkung nicht gelöscht werden kann, da sie nicht gefunden wird.

Ich möchte es nur, damit es beim Versuch, eine Einschränkung / einen Index / einen Schlüssel zu löschen, zuerst prüft, ob die Benennung vor 5.0 vorhanden ist, und wenn ja, löscht es sie, erstellt sie jedoch weiterhin unter Verwendung der neuen 5.0-Benennungskonventionen neu.

Die Namenskonventionen haben sich folgendermaßen von 4.3 auf 5.0 geändert:

Primärschlüssel / Indizes

Old: PK_Users                    New: PK_dbo.Users

Fremde Schlüssel

Old: FK_Users_Roles_Role_Id      New: FK_dbo.Users_dbo.Roles_Role_Id               

Hinweis: Ich kann nicht einfach alle Tabellen von EF neu generieren lassen. Ich habe Produktionsdaten in dieser Datenbank. Ich möchte dies auch nicht manuell für jede Tabelle mit benutzerdefinierten Migrationen ausführen müssen.

Edit: Ich habe eine ähnliche Frage gefundenWie kann ich Entity Framework 5-Migrationen stoppen, indem ich dbo hinzufüge? in Schlüsselnamen? Aber dieser Typ wollte nur die 5.0-Konventionen ignorieren und sich an 4.3 halten, und es ging nur um das Umbenennen von Tabellen. Ich würde es vorziehen, dies nicht zu tun, da nachfolgende Versionen von EF möglicherweise weitere Änderungen hervorrufen, die sich auf diesen Code auswirken und nur einen Ärger auf der ganzen Linie bedeuten.

Ich habe versucht, etwas in der gleichen Weise wie die Antwort zu tun:

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.", "");
    }
}

Und füge es der Konfiguration hinzu:

public Configuration()
    {
        CodeGenerator = new CodeMigrator();
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = false;

    }

Der Fehler tritt jedoch weiterhin auf:

dbo.Users_dbo.Departments_Department_Id 'ist keine Einschränkung. Einschränkung konnte nicht gelöscht werden. Siehe vorherige Fehler.

Ich habe tatsächlich versucht, jedes einzelne Mitglied in der zu überschreibenCSharpMigrationCodeGenerator und Setzen eines Haltepunkts in der return-Anweisung, und keiner von ihnen trifft. Es sieht so aus, als würde mein benutzerdefinierter Generator nie benutzt, und ich bin mir nicht sicher, was mir dabei fehlt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage