Ich habe einige Entitäten und ihre Navigationseigenschaften umbenannt und eine neue Migration in EF 5 generiert. Wie bei Umbenennungen in EF-Migrationen üblich, wurden Objekte standardmäßig gelöscht und neu erstellt. Das wollte ich nicht, also musste ich die Migrationsdatei so ziemlich von Grund auf neu erstellen.
public override void Up()
{
DropForeignKey("dbo.ReportSectionGroups", "Report_Id", "dbo.Reports");
DropForeignKey("dbo.ReportSections", "Group_Id", "dbo.ReportSectionGroups");
DropForeignKey("dbo.Editables", "Section_Id", "dbo.ReportSections");
DropIndex("dbo.ReportSectionGroups", new[] { "Report_Id" });
DropIndex("dbo.ReportSections", new[] { "Group_Id" });
DropIndex("dbo.Editables", new[] { "Section_Id" });
RenameTable("dbo.ReportSections", "dbo.ReportPages");
RenameTable("dbo.ReportSectionGroups", "dbo.ReportSections");
RenameColumn("dbo.ReportPages", "Group_Id", "Section_Id");
AddForeignKey("dbo.ReportSections", "Report_Id", "dbo.Reports", "Id");
AddForeignKey("dbo.ReportPages", "Section_Id", "dbo.ReportSections", "Id");
AddForeignKey("dbo.Editables", "Page_Id", "dbo.ReportPages", "Id");
CreateIndex("dbo.ReportSections", "Report_Id");
CreateIndex("dbo.ReportPages", "Section_Id");
CreateIndex("dbo.Editables", "Page_Id");
}
public override void Down()
{
DropIndex("dbo.Editables", "Page_Id");
DropIndex("dbo.ReportPages", "Section_Id");
DropIndex("dbo.ReportSections", "Report_Id");
DropForeignKey("dbo.Editables", "Page_Id", "dbo.ReportPages");
DropForeignKey("dbo.ReportPages", "Section_Id", "dbo.ReportSections");
DropForeignKey("dbo.ReportSections", "Report_Id", "dbo.Reports");
RenameColumn("dbo.ReportPages", "Section_Id", "Group_Id");
RenameTable("dbo.ReportSections", "dbo.ReportSectionGroups");
RenameTable("dbo.ReportPages", "dbo.ReportSections");
CreateIndex("dbo.Editables", "Section_Id");
CreateIndex("dbo.ReportSections", "Group_Id");
CreateIndex("dbo.ReportSectionGroups", "Report_Id");
AddForeignKey("dbo.Editables", "Section_Id", "dbo.ReportSections", "Id");
AddForeignKey("dbo.ReportSections", "Group_Id", "dbo.ReportSectionGroups", "Id");
AddForeignKey("dbo.ReportSectionGroups", "Report_Id", "dbo.Reports", "Id");
}
Ich versuche nur, dbo.ReportSections
in dbo.ReportPages
und dann dbo.ReportSectionGroups
in umzubenennen dbo.ReportSections
. Dann muss ich die Fremdschlüsselspalte von dbo.ReportPages
von Group_Id
nach umbenennen Section_Id
.
Ich lösche die Fremdschlüssel und Indizes, die die Tabellen miteinander verbinden, benenne die Tabellen und die Fremdschlüsselspalte um und füge dann die Indizes und Fremdschlüssel erneut hinzu. Ich nahm an, dass dies funktionieren würde, aber ich erhalte einen SQL-Fehler.
Nachricht 15248, Ebene 11, Status 1, Prozedur sp_rename, Zeile 215 Entweder ist der Parameter @objname mehrdeutig oder der beanspruchte @objtype (COLUMN) ist falsch. Nachricht 4902, Ebene 16, Status 1, Zeile 10 Das Objekt "dbo.ReportSections" kann nicht gefunden werden, da es nicht vorhanden ist oder Sie keine Berechtigungen haben.
Es fällt mir nicht leicht herauszufinden, was hier falsch ist. Jeder Einblick wäre enorm hilfreich.
Antworten:
Keine Ursache. Ich habe diesen Weg komplizierter gemacht, als es wirklich sein musste.
Das war alles was ich brauchte. Die Umbenennungsmethoden generieren nur einen Aufruf der gespeicherten Prozedur des Systems sp_rename , und ich denke, das hat sich um alles gekümmert, einschließlich der Fremdschlüssel mit dem neuen Spaltennamen.
quelle
RenameColumn
generiert einesp_rename
T-SQL-Anweisung, dieparsename
interne Verwendungen verwendet, die einige Einschränkungen aufweisen. Wenn Sie also einen Tabellennamen haben, der Punkte enthält, z. B. "SubSystemA.Tabellenname", verwenden Sie:RenameColumn("dbo.[SubSystemA.Tablename]", "OldColumnName", "NewColumnName");
RenameIndex(..)
in Ihrer Migration verwenden, um es umzubenennenRenameTable(..)
umzubenennen. Klingt nicht richtig, aber es hat bei mir funktioniert. Es ist die Methode, die das richtige T-SQL (execute sp_rename ...
) erstellt. Wenn Sie update-database -verbose ausführen, werden Sie es selbst sehen.Wenn Sie den erforderlichen Code in der Migrationsklasse nicht manuell schreiben / ändern möchten, können Sie einen zweistufigen Ansatz verfolgen, bei dem der erforderliche Code automatisch erstellt
RenameColumn
wird:Erster Schritt Verwenden Sie die
ColumnAttribute
den neuen Spaltennamen einzuführen und dann Add-Migration (zBAdd-Migration ColumnChanged
)Schritt 2 Ändern Sie den Eigenschaftsnamen und wenden Sie ihn erneut auf dieselbe Migration (z. B.
Add-Migration ColumnChanged -force
) in der Package Manager-Konsole anWenn Sie sich die Migrationsklasse ansehen, sehen Sie, dass der automatisch generierte Code lautet
RenameColumn
.quelle
The name 'Rename_SalesArea' is used by an existing migration.
-force
Parameter bei der Verwendung von Add-MigrationUm die Antwort von Hossein Narimani Rad ein wenig zu erweitern, können Sie eine Tabelle und Spalten mit System.ComponentModel.DataAnnotations.Schema.TableAttribute bzw. System.ComponentModel.DataAnnotations.Schema.ColumnAttribute umbenennen.
Dies hat einige Vorteile:
Zum Beispiel hinzufügen
[Table("Staffs")]
:Erzeugt die Migration:
quelle
In EF Core verwende ich die folgenden Anweisungen, um Tabellen und Spalten umzubenennen:
Zum Umbenennen von Tabellen:
Zum Umbenennen von Spalten:
quelle
In ef core können Sie die Migration ändern, die nach dem Hinzufügen der Migration erstellt wurde. Und dann Update-Datenbank. Ein Beispiel hat unten gegeben:
quelle
Ich habe es gerade in EF6 versucht (Code First Entity Rename). Ich habe die Klasse einfach umbenannt und eine Migration über die Paketmanagerkonsole und voila hinzugefügt. Eine Migration mit RenameTable (...) wurde automatisch für mich generiert. Ich muss zugeben, dass ich sichergestellt habe, dass die einzige Änderung an der Entität darin bestand, sie umzubenennen, sodass keine neuen Spalten oder umbenannten Spalten vorhanden sind. Daher kann ich nicht sicher sein, ob dies eine EF6-Sache ist oder ob EF (immer) in der Lage war, solche einfachen Migrationen zu erkennen.
quelle
DbSet
in Ihrer umzubenennenDatabaseContext
). Das Ändern des Primärschlüssels verursacht Probleme. Bei der Migration wird versucht, sie zu löschen und eine neue zu erstellen. Sie müssen dies also anpassen und die Spalte umbenennen, wie es Chevs Antwort lautet.Tabellennamen und Spaltennamen können im Rahmen der Zuordnung von angegeben werden
DbContext
. Dann ist dies bei Migrationen nicht erforderlich.quelle