76

デフォルトの ASP.NET MVC 4 テンプレートを EF 5.0 Code First Migrations で正常に実行できました。ただし、モデル プロパティ名を更新すると、対応するテーブル列データが EF 5.0 によって削除されます。

自動化された方法でデータを削除せずに、テーブルの列の名前を変更することは何とか可能ですか?

4

8 に答える 8

117

移行の Up メソッドと Down メソッドを手動で編集して、自動的に生成されるとRenameColumnを置き換えるメソッドを使用します。AddColumnDropColumn

于 2012-11-29T00:41:26.487 に答える
47

既に述べたように、自動生成されたAddColumnandをに置き換えます。DropColumnRenameColumn

例:

namespace MyProject.Model.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class RenameMyColumn : DbMigration
    {
        public override void Up()
        {
            // Remove the following auto-generated lines
            AddColumn("dbo.MyTable", "NewColumn", c => c.String(nullable: false, maxLength: 50));
            DropColumn("dbo.MyTable", "OldColumn");

            // Add this line
            RenameColumn("dbo.MyTable", "OldColumn", "NewColumn");
        }

        public override void Down()
        {
            // Remove the following auto-generated lines
            AddColumn("dbo.MyTable", "OldColumn", c => c.String(nullable: false, maxLength: 50));
            DropColumn("dbo.MyTable", "NewColumn");

            // Add this line
            RenameColumn("dbo.MyTable", "NewColumn", "OldColumn");
        }
    }
}
于 2015-12-23T23:03:51.997 に答える
26

これを行うと、移行を呼び出すことができRenameColumnます。

[Column("NewName")]
public string OldName { get; set; }

生成された移行は次のとおりです。

    public override void Up()
    {
        RenameColumn(table: "Schema.MyTable", name: "OldName", newName: "NewName");
    }

    public override void Down()
    {
        RenameColumn(table: "Schema.MyTable", name: "NewName", newName: "OldName");
    }

プロパティと DB 列を同じ名前にする場合は、後でプロパティの名前を変更して、Column属性を削除できます。

于 2017-01-19T19:31:36.873 に答える
4

さて、この回答は EF4.3 に関する私の知識に基づいているため、移行が EF5 でもほぼ同じように機能することを願っています :) 移行を作成したら、Up メソッドと Down メソッドの間にコードを追加できるはずです。古いプロパティの削除と新しいプロパティの作成。このコードは、プロパティ データを正しい方向に移動する必要があります。生のSQLを入力してデータの移動を実行できるSQL()メソッドで解決しました。

移行の Up メソッドで:

SQL("update [TheTable] set [NewColumn] = [OldColumn]");

そして Down() メソッドで:

SQL("update [TheTable] set [OldColumn] = [NewColumn]");

このアプローチの欠点は、コードを現在使用しているデータベースと組み合わせる可能性があることです (生の DB 固有の SQL を記述しているため)。データ移動に利用できる他の方法もあるかもしれません。

ここで入手可能な詳細情報: MSDN

于 2012-10-27T22:33:08.310 に答える
3

Josh Gallagherの答えに追加:

一部の場所では、sp_RENAME 構文は次のように記述されています。

sp_RENAME 'TableName.[OldColumnName]' , '[NewColumnName]', 'COLUMN'

ただし、実際には、新しい列名に括弧が含まれます。

DbMigration の RenameColumn() メソッドはおそらく同じことを行うため、新しい列名を指定するときに括弧を使用しないでください。

また、名前を変更する列が主キーの一部である場合、Up() および Down() で自動生成されるコマンドには、DropPrimaryKey() および AddPrimaryKey() が含まれます。RenameColumn() を使用する場合、これらは必要ありません。基になる sp_RENAME は、必要に応じて主キーを自動的に更新します。

于 2015-03-25T00:19:06.963 に答える
0

+Josh Gallagher が言ったように、次のようなことを行うために up() を使用できます。

public override void Up()
        {

            RenameColumn("dbo.atable","oldname","newname");
            AddColumn("dbo.anothertable", "columname", c => c.String(maxLength: 250));

        }

私はこれが移行に入るのに良い助けになることを発見しました;)

于 2015-08-29T16:26:52.513 に答える