2017-08-07 4 views
0

私はEntity FrameworkでCode Firstアプローチを使用しています。Code First - Entity Frameworkで変更されたテーブルのみを削除して作成する方法

私は以下のようにカスタムデータベース初期化子を作成しました。

public class CustomInit : IDatabaseInitializer<APIContext> 
    { 
     public void InitializeDatabase(APIContext context) 
     { 
      bool dbExists; 

      dbExists = context.Database.Exists(); 

      if (dbExists) 
      { 
       // remove all tables 
       context.Database.ExecuteSqlCommand(
        "EXEC sp_MSforeachtable @command1 = \"DROP TABLE ?\""); 

       // create all tables 
       var dbCreationScript = ((IObjectContextAdapter) 
         context).ObjectContext.CreateDatabaseScript(); 
       context.Database.ExecuteSqlCommand(dbCreationScript); 

       context.SaveChanges(); 
      } 
      else 
      { 
       throw new ApplicationException("No database is present"); 
      } 
     } 
    } 

上記のコードに従って、データベース内のすべてのテーブルは削除され、再作成されます。私がする必要がどのような

のようなコード に変更されたテーブル/エンティティをドロップして作成している - 任意の列を追加または削除など

はありますとにかく、私たちはこれを行うことができますか?

ご指摘いただきありがとうございます。

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>()); 

これはあなたのプログラムを実行するたびにデータベースに対して、あなたのモデルをチェックし、自動的に削除してデータベースを再作成します。

+0

[移行](https://msdn.microsoft.com/en-us/library/jj591621(v=11113).aspx)が使用されないのはなぜですか? –

+0

@ IvanR.私はMigrationsを一度も使用していません。私の質問への解決策を見つけるために、どのように移行を実装できるかについて私を導くことができれば、あなたのようなものでしょう。ありがとうございました –

答えて

1

migrationsを使用してデータベーススキームを更新できます。

  1. オープンパッケージマネージャコンソール([ツール] - > [ライブラリパッケージマネージャ - >パッケージマネージャコンソール)
  2. ラン有効-移行コマンド
  3. 変更して、モデル
  4. ラン追加-移行をパッケージマネージャーコンソールのコマンド
  5. 実行更新データベースコマンドを使用してモデルの変更をデータベースに適用します。

もちろん、カスタムデータベース初期化ツールを使用しないでください。

+0

回答を追加する..最初の移行作業を行うには、データベースが空であるか作成されていない必要があります。 –

0

最も簡単な解決策は、あなたのコンテキストのコンストラクタで、あなたにこの初期化を追加することですモデルが変更されている場合

あなたは、あなたが次の初期化を使用することができ、データベースをドロップしたい、と単純にそれを更新しない場合:

Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, Config>()); 

は、しかしEntity Frameworkのコアでこれらの作業のどちらをお勧めすること、マイクロソフトでは.NETコアバージョンの自動移行を実装していないため、実装しない予定です。

+0

私はこれを試しました。しかし、変更はdbに反映されません。新しいエンティティを追加しましたが、エンティティ用にテーブルisntが作成されました。 –

+0

プロジェクトを実行すると、「データベースに「xyz」という名前のオブジェクトが既に存在します。」というエラーがスローされます。 –

+0

@DheerajKumar既存のエンティティの変更はできますか?私はこれらの初期化は既存のテーブルを更新するだけだと思いますが、新しいテーブルを作成しないでください。 – stybl

0

データベースを更新して適用した初期移行に戻すことができます。

上記のコマンド

アップデート - データベース-targetMigration「MigrationNameは、」あなたはEFの移行の一環として適用されているものは何でも、すべてのDBの変更を元に戻します。

関連する問題