コードの最初の移行を無効にするにはどうすればよいですか


85

EF5にコードファーストのエンティティモデルがあります。しかし、データベースの変更を手動で管理したいのですが、EFに既存のデータベースとそのすべてのデータを変更させたくありません。しかし、EFマッピングとデータベースで並行して変更を加えると、EFは適切に動作することを拒否し、コードファーストマイグレーションを使用する必要があると通知します。これをオフにするにはどうすればよいですか?


回答:


100

Database.SetInitializerをnullに設定します。

public class DatabaseContext: DbContext
{
    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    {
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    }

2
コンテキストのインスタンスコンストラクターにイニシャライザーを設定しても意味がありません。新しいコンテキストを作成しようとすると、EFは実際にそのコードに到達する前に初期化子を呼び出します。
jcl 2016

1
VS 2017の「診断ツール」を見て、答えを確認しました。コンストラクターで初期化子をnullに設定した後、最初に必要なSQLクエリが停止する前にADO.NETが呼び出します。
カール

2
期待どおりに動作します。EFが以前にイニシャライザーを呼び出すのは事実ですが、コンストラクター内で再度呼び出すと__MigrationHistory、最新の移行がないという事実を無視したい場合に備えて、DbContextは移行を無視します。とにかくそれをしなさい。私の場合、開発環境で移行を使用しますが、本番環境にデプロイするときは、SSDTを使用してデータベースを更新します。したがって、EFは__MigrationHistory最新の移行がないためにモデルが変更されたと文句を言いますが、データベースが更新されることは保証できます。
アリソン2018年

呼び出しをDatabase.SetInitializerコンストラクターからクラスコンストラクターに移動することをお勧めします。これにより、呼び出しは1回だけ行われます。
スティーブン

40

だから私が見つけた最も完全な答えはこれです:

  1. Migrationsプロジェクト内のフォルダを削除します。
  2. Database.SetInitializer<DatabaseContext>(null);DatabaseContext初期化子内に設定します。
  3. __MigrationHistoryデータベース内のテーブルを削除します。EF6 +の場合、テーブルはの下にありますTablesが、以前のバージョンの場合、テーブルはの下にありSystem Tablesます。
  4. ビルドして実行します。
  5. 利益。

残念ながら、これらの手順を実行した後でも、EF6__MigrationHistoryはアプリケーションが起動するたびに存在を確認するため、アプリの起動時間がさらに数ミリ秒長くなります。__MigrationHistoryチェックを完全に無効にする方法はありますか?
ダイ

27

移行を完全にオフにしたい場合:

https://stackoverflow.com/a/9709407/141172

ただし、コードの最初の移行を有効にしておく方がよいと思いましたが、-Scriptオプションを使用して、各データベース(開発、QA、本番)に手動で適用できるDB変更スクリプトをEFに作成させます。

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

そうすれば、EFが変更スクリプトを作成し、適用される変更を完全に制御できます。他のソースコードと同じように変更スクリプトをバージョン管理します。


1
あなたのリンクは実際にはに対応していませんcompletely turn off migrations。これを行うには:Database.SetInitializer<YourContextType>(null)アプリケーションの起動に追加します
Don Cheadle 2015

EFコアでこれを達成する方法はありますか?
シミーワイツハンドラー

@Shimmy:EFCoreがデータベースを自動的に変更しようとしないでください。github.com/dotnet/efcore/issues/3152
Eric J.

26

すでに移行を使用している場合は、イニシャライザーのみを変更しても効果はありません。Management Studioに移動し、データベーステーブルを開き、System Tablesフォルダーに移動して、__MigrationHistoryそこにあるテーブルを削除する必要があります(EF6以降の場合は、すぐ下にありますTables)。これにより、移行が完全に無効になります。


7
テーブル__MigrationHistoryは、システムテーブルではなく、テーブルの直下にあります。
Peter Hedberg 2014年

6
@PeterHedbergこれはEF6 +にも当てはまります。以前のバージョンでは、の下にありましたSystem Tables
Episodex 2015年

1
を使用して、テーブルを削除する代わりに、テーブルの名前を変更することもできますsp_rename。初期化子も無効にしました。
NMrt

2

私はこの「問題」を

  1. データベースからテーブル「_MigrationHistory」を削除しています。
  2. プロジェクトから「Migrations」フォルダを削除します。
  3. EDMXファイルを更新しています。
  4. プロジェクトをクリーンアップして再構築します。

私の環境の設定は次のとおりです

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0

EDMXファイルで何を更新したか聞いてもいいですか?私もDatabaseFirstを使用していますが、まだ存在しない移行テーブルをクエリしています...ありがとうございます。
dalcam 2018年

後で移行が必要になった場合、新しい_MigrationHistoryテーブルが自動的に作成され ますか?
sairfan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.