2016-11-20 13 views
4

私のプロジェクトでエンティティフレームワークのコードの最初のアプローチにちょうど従っています。常に私はコマンドを使用してdbを再生成するように強制されます。しかし、今私はそれを安定させることができます。私はシナリオを持っており、このフレームワークは、移行スクリプトを作成して論理的ではない、私は何かが不足している可能性がありますあなたの助けが必要ですエンティティフレームワーク - コードファーストアプローチ

シナリオです - 私は、私のテーブルのすべての設定でクラス、私はかなり感銘を受けた。私は、エンティティに変更を行うときには、例えばのために、私が持っているディールクラス

私はLenderName、BorrowerNameと呼ばれる新しいプロパティを追加し、TEHアドオン移行スクリプトを実行し、それが、私のために移行スクリプトを作成し

public partial class LenderBorrowerName : DbMigration 
    { 
     public override void Up() 
     { 
      DropColumn("dbo.Deals", "LenderName"); 
      DropColumn("dbo.Deals", "BorrowerName"); 
      DropColumn("dbo.Deals", "Discriminator"); 
     } 

     public override void Down() 
     { 
      AddColumn("dbo.Deals", "Discriminator", c => c.String(nullable: false, maxLength: 128)); 
      AddColumn("dbo.Deals", "BorrowerName", c => c.String()); 
      AddColumn("dbo.Deals", "LenderName", c => c.String()); 
     } 
    } 

問題は、元のデータベースにこのフィールドがなく、この移行スクリプトを使用してデータベースに追加するとします。これらのフィールドを更新するには、update-migration -forceを実行すると、上記のup()関数が原因でテーブルからカラムを削除しようとすると失敗します。 Microsoftがドロップスクリプトを追加する理由は、開発者が手動で削除する必要があるということですか?助けてください

答えて

0

ヒントはこちらDiscriminatorの列です。 EFは、TPH、Table-Per-Hierarchyと呼ばれる継承を実装するためのデフォルト戦略を適用します。 Discriminatorフィールドは、エンティティ間の継承があるときにEFによって自動的に生成されます。

既存のエンティティに2つのプロパティを追加するよりも、モデルの変更が多かったようです。おそらく、それらを派生クラスから基本クラスに移動するか、逆の方法で移動しました。 DbContextには、基本エンティティまたは派生エンティティの場合はDbSetしか含まれていませんが、両方の場合は含まれていないようです。移行では、デフォルトでDbContextに含まれるエンティティのみがDbSetsとして含まれます(マッピングに明示的に含めるか除外することもできます)。したがって、あなたの移行ではDbContextのエンティティのフィールドのみが生成され、他のフィールドのフィールドは生成されず、EFはこれらのプロパティを削除したと解釈しています。そのため、DropColumn文が得られます。

ここでの解決方法は、DbSetDbContextに追加し、もう一度移行を生成することです。

HereあなたはTPHについてもっと知ることができます。

異なる説明がそれはUpdate-DatabaseAdd-Migration数回実行すると、データベースがあなたの__MigrationHistoryテーブルの内容と矛盾している状態で放置されてきた-forceパラメータを使用した後である可能性があります。可能であれば、手動でデータベースを削除し、クリーンInitialのマイグレーションを生成して実行することが私の助言です。

関連する問題