Entity Framework CodeFirstを使用したアプリケーションがあります。
テーブルに、列を追加する必要があります。そこで、それをモデルに追加して、移行を作成しました。
ただし、移行中に、既存のエントリを更新して、この新しい列に値を追加したいと思います。この値は、データベース(私の「構成」テーブルの定数フィールド)から取得する必要があります。
ただし、デフォルト値は既存のエントリにのみ適用され、次のエントリには適用されません。
Migrationクラスからそれを行うにはどうすればよいですか?
私の現在の移行クラス:
public override void Up()
{
var theDefaultValue = MyConstants.MyConstantParameterFromDatabase;
AddColumn("MySchema.MyTable", "MyNewColumn", c => c.Decimal(nullable: false, precision: 18, scale: 2));
}
編集:既存のすべてのエントリ(値が0)を更新するための解決策を探していますが、この移行後にのみ...
Up()
メソッドを変更し、SQLステートメントを含めて、既存の行に列値を設定するだけです。これは、データベースが更新されたときにのみ実行され、更新にはこの特定の移行が含まれます。したがって、Update-Database
が呼び出されると、既存の行のみが更新されます。
AddColumn
コマンドの後に次のようなコードを追加して、SQLステートメントの実行時に列がテーブルですでに使用可能になるようにします。
Sql("UPDATE dbo.MyTable SET Column = (SELECT val FROM config)");
注:(SELECT val FROM config)
は疑似コードであり、目的の値を返すクエリに置き換える必要があります
update-database
を実行しながら、既存の列から値をコピーして、Postgresql
データベースに新しく導入された列に挿入したいと思いました。そこで、Up
クラスのMigration
関数を編集しました。
protected override void Up(MigrationBuilder migrationBuilder) {
migrationBuilder.AddColumn < string > (
name: "FileName", table: "FavoriteFiles", nullable: false, defaultValue: "");
migrationBuilder.Sql("UPDATE \"FavoriteFiles\" SET \"FileName\" = SPLIT_PART(\"FilePath\", '/', 7) WHERE \"FilePath\" IS NOT NULL;");
}
次に、Update-Database
を実行しました。それが役に立てば幸い。