Entity Framework Migrations renaming tables and columns
c#, entity-framework, entity-framework-5, entity-framework-migrations, sql-server
Solution
Nevermind. I was making this way more complicated than it really needed to be.
This was all that I needed. The rename methods just generate a call to the sp_rename system stored procedure and I guess that took care of everything, including the foreign keys with the new column name.
public override void Up()
{
RenameTable("ReportSections", "ReportPages");
RenameTable("ReportSectionGroups", "ReportSections");
RenameColumn("ReportPages", "Group_Id", "Section_Id");
}
public override void Down()
{
RenameColumn("ReportPages", "Section_Id", "Group_Id");
RenameTable("ReportSections", "ReportSectionGroups");
RenameTable("ReportPages", "ReportSections");
}
Problem
I renamed a a couple entities and their navigation properties and generated a new Migration in EF 5. As is usual with renames in EF migrations, by default it was going to drop objects and recreate them. That isn't what I wanted so I pretty much had to build the migration file from scratch. ``` 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"); } ``` All I'm trying to do is rename `dbo.ReportSections` to `dbo.ReportPages` and then `dbo.ReportSectionGroups` to `dbo.ReportSections`. Then I need to rename the foreign key column on `dbo.ReportPages` from `Group_Id` to `Section_Id`. I am dropping the foreign keys and indexes linking the tables together, then I am renaming the tables and the foreign key column, then I'm adding the indexes and foreign keys again. I assumed this was going to work but I am getting a SQL error. Msg 15248, Level 11, State 1, Procedure sp_rename, Line 215 Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong. Msg 4902, Level 16, State 1, Line 10 Cannot find the object "dbo.ReportSections" because it does not exist or you do not have permissions. I'm not having an easy time figuring out what is wrong here. Any insight would be tremendously helpful.