2016-06-28 11 views
1

私はEntity Framework - Code Firstを使用しています。データベースはすでに埋め込まれています。 テーブルに列を追加し、他の2つの列を削除する必要があります。新しい列は古い列の結合でいっぱいになります。 私は移行とシードメソッドを使用しようとしています。移行中に別の列から新しい列を削除してから削除してください。

私は自分の仕事を再開:

  1. は、テーブルの列を追加します。
  2. 2つの他の列のデータを新しい列に入力します。
  3. 他の2つの列を削除します。

ここに私の移行:

public partial class MyNewMigration : DbMigration 
{ 
    public override void Up() 
    { 
     AddColumn("customers.myTable", "newCol", c => c.String()); 
     DropColumn("customers.myTable", "oldCol1"); 
     DropColumn("customers.myTable", "oldCol2"); 
    } 

    public override void Down() 
    { 
     AddColumn("customers.myTable", "oldCol1", c => c.String()); 
     AddColumn("customers.myTable", "oldCol2", c => c.String()); 
     DropColumn("customers.myTable", "newCol"); 
    } 
} 

私はメソッド内で新しい列を埋めるためにコードを追加する必要がありますか?

+1

はい、追加と削除の間にSql()コマンドを使用してください。https://msdn.microsoft.com/en-us/data/jj591621.aspx#sql –

答えて

1

Upメソッド内の新しい列を埋めるコードを追加する必要がありますか?

はい、データを変換する必要があります。複雑なデータ変換でSQL関数やストアドプロシージャが必要になるかもしれません。あなたは、移行ファイルで行うことができる。例えば

:私は前に述べたように

AddColumn("customers.myTable", "newCol", c => c.String()); 
Sql("UPDATE customers.myTable SET newCol= ''"); 

または

Sql("Update customers.myTable SET newCol = oldCol1+ oldCol2"); 

、あなたは複雑なデータ形質転換のが必要な場合は、ストアドプロシージャまたは関数を使用する必要があります入力パラメータと入出力パラメータを追加してから、それらを追加してからSqlコマンドでそれらを使用できるようになります。

代わりに、移行種を使用することができます。シードメソッドは、各マイグレーションレベル間で呼び出されます。たとえば、マイグレーションレベル1,2,3の場合、3回呼び出されます。シード方式の問題は、すべての移行レベルの移行ロジックを1つのファイルに構築する必要があることです。あなたはスイッチケースを使用することができますまたは他の場合は、あなたがどのレベルにチェックします。レベル1の場合は、マイグレーション・レベル1のコード・ロジックを追加し、レベル2の場合はレベル2以降のコードを追加する必要があります。このapporachは私にとっては清潔ではなく、あなたがそれを使用したい場合は、Factory Patternでそれを使用して、各マイグレーションレベル(SRP)ごとにCodeをサポートすることができます。両方のapporachsはあなたに依存する同じことを行います。

+0

ありがとうございます。シードメソッドの意味を理解していない。私は各移行のためのシードメソッドを持っていないだろうか?または、シードメソッドは、データベースを初期化するために使用されますか?私はデータベースを初期化するときに同じ方法を使用できませんか? 同じことをする2つの異なる方法があるように見えます! – Ciccio

関連する問題