2016-03-22 3 views
0

まず、これは前に尋ねられたはずですが、グーグルで正確な答えを見つけることができなかったことは確かです。Entity Framework:列を追加するにはシードデータを変更する必要がありますか?

私は、移行を使用するコードの最初のエンティティフレームワークプロジェクトを継承しています。私は、テーブルに(null非許容)のカラムを追加しましたし、私はすべての既存のエントリに対してこの列に値を挿入する必要がある - 既定値ではありません。追加いくつかのシード・データが

public override void Up() 
{ 
    AddColumn("dbo.QuestionType", "Duplicated", c => c.Boolean(nullable: false, defaultValue: false)); 
    Sql("UPDATE dbo.QuestionType SET Duplicated = 1"); 
} 

がしかし、もともとありましたこの表に:更新ステートメントを直ちに(各移動後に呼ばれる)シードメソッドへのコールのデータによって上書きされることを意味する

context.QuestionTypes.AddOrUpdate(
       e => e.Name, 
       new QuestionType() { Name = QuestionTypeNames.INTERVIEWER}); 

私の質問は以下のとおりです。

  1. は、それが単にシードデータに付加価値を追加する(あるいはこのすべてが新しい列が上に存在しない以前の移行のために壊すことになります「安全」ですデータベース)。
  2. また、この移行(およびそれ以降のすべての移行)後にSeedメソッドが実行されないようにする方法があります。

おかげ

答えて

1

Entity Frameworkのは素晴らしいですが、それを効果的に使用できるように、私たちは本当に移行とシード方法がであることを確認することで勤勉であることにするしかない怖いです同期してお互いにうまく動作します。

  1. あなたはシード(すなわち。new QuestionType() { Name = QuestionTypeNames.INTERVIEWER, Duplicated = true})に新たな価値を置く場合は、[はい、これは最新の移行は破るために適用されていないシステムの原因となります。これは、シードメソッドがDuplicated列を検索しても見つからないためです。

  2. いいえ、少なくとも自動的にはこれを行う方法はないと思います。 1つの解決策は、シードメソッドのcontextオブジェクトにアクセスできるため、データベースにクエリを実行して、特定の移行がすでに存在するかどうかを確認するだけです。その後、QuestionTypesの特定のシーダーをifステートメントにラップして、前の照会の結果を利用することができます。

+0

これを確認していただきありがとうございます。マイグレーションが適用されているかどうかを確認することはできませんでした。 Seedメソッドに追加されたデータをより詳細に調べてみると、何らかのデータ(ハードコードされたパスワードなど)は存在しないはずです。そのため、私の最善の策はシードからデータを削除することですメソッドを完全に... –

+0

Seed()を実行する前に移行が適用されるため、重複は常に存在します。 –

関連する問題