web-dev-qa-db-ja.com

エンティティフレームワークの移行-既存のエントリの値を含む新しい列を追加します

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)を更新するための解決策を探していますが、この移行後にのみ...

13
user3544117

Up()メソッドを変更し、SQLステートメントを含めて、既存の行に列値を設定するだけです。これは、データベースが更新されたときにのみ実行され、更新にはこの特定の移行が含まれます。したがって、Update-Databaseが呼び出されると、既存の行のみが更新されます。

AddColumnコマンドの後に次のようなコードを追加して、SQLステートメントの実行時に列がテーブルですでに使用可能になるようにします。

Sql("UPDATE dbo.MyTable SET Column = (SELECT val FROM config)");

注:(SELECT val FROM config)は疑似コードであり、目的の値を返すクエリに置き換える必要があります

17
JotaBe

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を実行しました。それが役に立てば幸い。

0
Sibeesh Venu