デフォルトの ASP.NET MVC 4 テンプレートを EF 5.0 Code First Migrations で正常に実行できました。ただし、モデル プロパティ名を更新すると、対応するテーブル列データが EF 5.0 によって削除されます。
自動化された方法でデータを削除せずに、テーブルの列の名前を変更することは何とか可能ですか?
デフォルトの ASP.NET MVC 4 テンプレートを EF 5.0 Code First Migrations で正常に実行できました。ただし、モデル プロパティ名を更新すると、対応するテーブル列データが EF 5.0 によって削除されます。
自動化された方法でデータを削除せずに、テーブルの列の名前を変更することは何とか可能ですか?
移行の Up メソッドと Down メソッドを手動で編集して、自動的に生成されるとRenameColumn
を置き換えるメソッドを使用します。AddColumn
DropColumn
既に述べたように、自動生成されたAddColumn
andをに置き換えます。DropColumn
RenameColumn
例:
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");
}
}
}
これを行うと、移行を呼び出すことができ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
属性を削除できます。
さて、この回答は EF4.3 に関する私の知識に基づいているため、移行が EF5 でもほぼ同じように機能することを願っています :) 移行を作成したら、Up メソッドと Down メソッドの間にコードを追加できるはずです。古いプロパティの削除と新しいプロパティの作成。このコードは、プロパティ データを正しい方向に移動する必要があります。生のSQLを入力してデータの移動を実行できるSQL()メソッドで解決しました。
移行の Up メソッドで:
SQL("update [TheTable] set [NewColumn] = [OldColumn]");
そして Down() メソッドで:
SQL("update [TheTable] set [OldColumn] = [NewColumn]");
このアプローチの欠点は、コードを現在使用しているデータベースと組み合わせる可能性があることです (生の DB 固有の SQL を記述しているため)。データ移動に利用できる他の方法もあるかもしれません。
ここで入手可能な詳細情報: MSDN
Josh Gallagherの答えに追加:
一部の場所では、sp_RENAME 構文は次のように記述されています。
sp_RENAME 'TableName.[OldColumnName]' , '[NewColumnName]', 'COLUMN'
ただし、実際には、新しい列名に括弧が含まれます。
DbMigration の RenameColumn() メソッドはおそらく同じことを行うため、新しい列名を指定するときに括弧を使用しないでください。
また、名前を変更する列が主キーの一部である場合、Up() および Down() で自動生成されるコマンドには、DropPrimaryKey() および AddPrimaryKey() が含まれます。RenameColumn() を使用する場合、これらは必要ありません。基になる sp_RENAME は、必要に応じて主キーを自動的に更新します。
+Josh Gallagher が言ったように、次のようなことを行うために up() を使用できます。
public override void Up()
{
RenameColumn("dbo.atable","oldname","newname");
AddColumn("dbo.anothertable", "columname", c => c.String(maxLength: 250));
}
私はこれが移行に入るのに良い助けになることを発見しました;)