144

いくつかのエンティティとそのナビゲーション プロパティの名前を変更し、EF 5 で新しい移行を生成しました。EF 移行での名前の変更ではよくあることですが、既定では、オブジェクトを削除して再作成します。それは私が望んでいたことではないので、移行ファイルを最初から作成する必要がありました。

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

私がやろうとしているのは、名前を に変更dbo.ReportSectionsしてから にdbo.ReportPages変更dbo.ReportSectionGroupsすることだけですdbo.ReportSections。次に、外部キー列の名前を から に変更する必要がdbo.ReportPagesありGroup_IdますSection_Id

テーブルをリンクする外部キーとインデックスを削除し、テーブルと外部キー列の名前を変更してから、インデックスと外部キーを再度追加しています。これでうまくいくと思っていましたが、SQL エラーが発生しました。

メッセージ 15248、レベル 11、状態 1、プロシージャ sp_rename、行 215 パラメータ @objname があいまいであるか、要求された @objtype (COLUMN) が間違っています。メッセージ 4902、レベル 16、状態 1、行 10 オブジェクト "dbo.ReportSections" が存在しないか、権限がないため、見つかりません。

ここで何が問題なのかを理解するのは簡単ではありません。どんな洞察も非常に役に立ちます。

4

8 に答える 8

173

どうでも。私はこの方法を必要以上に複雑にしていました。

必要なものはこれだけでした。名前の変更メソッドは、sp_renameシステム ストアド プロシージャへの呼び出しを生成するだけで、新しい列名を持つ外部キーを含むすべてを処理したと思います。

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");
}
于 2012-11-08T20:27:43.730 に答える
61

Migration クラスで必要なコードを手動で作成/変更したくない場合は、必要なコードを自動的に作成する 2 段階のアプローチに従うことができますRenameColumn

ステップ 1を使用しColumnAttributeて新しい列名を導入し、次に add-migration (例: Add-Migration ColumnChanged)

public class ReportPages
{
    [Column("Section_Id")]                 //Section_Id
    public int Group_Id{get;set}
}

ステップ 2Add-Migration ColumnChanged -forceプロパティ名を変更し、パッケージ マネージャー コンソールで同じ移行 (例) に再度適用します。

public class ReportPages
{
    [Column("Section_Id")]                 //Section_Id
    public int Section_Id{get;set}
}

Migration クラスを見ると、自動的に生成されたコードがRenameColumn.

于 2016-07-23T07:40:19.720 に答える
39

EF Core では、次のステートメントを使用して、テーブルと列の名前を変更します。

テーブルの名前変更について:

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.RenameTable(
            name: "OldTableName",
            schema: "dbo",
            newName: "NewTableName",
            newSchema: "dbo");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.RenameTable(
            name: "NewTableName",
            schema: "dbo",
            newName: "OldTableName",
            newSchema: "dbo");
    }

列の名前変更について:

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.RenameColumn(
            name: "OldColumnName",
            table: "TableName",
            newName: "NewColumnName",
            schema: "dbo");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.RenameColumn(
            name: "NewColumnName",
            table: "TableName",
            newName: "OldColumnName",
            schema: "dbo");
    }
于 2018-06-16T08:16:16.047 に答える