web-dev-qa-db-ja.com

Entity Framework Code Onlyエラー:データベースの作成以降、コンテキストをサポートするモデルが変更されました

Entity Framework 4とCTP4を使用して、既存のデータベースに対して使用する「コードのみ」POCOを作成しました。クエリを実行するとエラーが発生します

データベースが作成されてから、「xyzContext」コンテキストをサポートするモデルが変更されました。データベースを手動で削除/更新するか、IDatabaseInitializerインスタンスでDatabase.SetInitializerを呼び出します。たとえば、RecreateDatabaseIfModelChanges戦略は、データベースを自動的に削除および再作成し、オプションで新しいデータをシードします。

なぜこれが起こっているのか、何を変更できるのか、私にはわかりません。 POCOを作成し、単純なDbContextを定義し、いくつかの調整を行ってから、単純なクエリを実行しようとしました。私は「コードのみ」を使用しているため、行う必要のある構成設定を知りません。また、データベースは既存のデータベースであるため、データベースを再作成または削除したくありません。

アイデアをありがとう。

50
Donald Hughes

スコット・ガスリーのブログのこの投稿に対するコメントで答えを見つけました。

http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx

この例外が発生している場合:

「データベースが作成されてから、「生産」コンテキストを支えるモデルが変更されました。データベースを手動で削除/更新するか、IDatabaseInitializerインスタンスでDatabase.SetInitializerを呼び出してください。」

ここで何が起こっているのか、それについて何をすべきかを示します。

モデルが最初に作成されるときに、DatabaseInitializerを実行して、データベースが存在しない場合はデータベースを作成するか、シードデータを追加します。デフォルトのDatabaseInitializerは、モデルを使用するために必要なデータベーススキーマと、データベースで作成されたEdmMetadataテーブルに格納されているスキーマのハッシュを比較しようとします(Code Firstがデータベースを作成する場合)。既存のデータベースにはEdmMetadataテーブルがないため、ハッシュがありません。そのテーブルが欠落している場合、今日の実装はスローされます。これはデフォルトであるため、最終バージョンを出荷する前に、この動作の変更に取り組みます。それまでは、既存のデータベースは通常、データベース初期化子を必要としないため、以下を呼び出すことでコンテキストタイプに対してオフにできます。

Database.SetInitializer<Production>(null);
77
Donald Hughes

これは、既存のデータベースでEFを使用するためのCTP4のバグです。

以下を呼び出すことで修正できます:

Database.SetInitializer<YourContext>(null);

global.asaxのApplication_Startメソッド

31
Steve Lydford

上記でコメントしましたが、EF5をいじってその動作を理解するようになったときに機能しました。現在、「実際の」コードを書いています。MEFを使用してDbContextをインスタンス化し、すべての構成依存関係を構成可能なパーツとして注入することに決めたアーキテクチャのため、コード内のコンテキストごとのデータベース初期化子の設定から移動しました。

そのため、上記のエラーにすぐに遭遇しましたが、今回は、以下の構成ファイルエントリを使用して解決することを選択しました。

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <contexts>
      <context type="Basd.Erp.ContactContext, Basd.Erp" disableDatabaseInitialization="true"></context>
    </contexts>
  </entityFramework>

したがって、entityFrameworkの構成ファイルセクションでdisableDatabaseInitialization = "true"を設定すると、上記のエラーを克服できます。コードにはないため、抽象化されたビルダー/ファクトリを使用してコンテキストを「より簡単に」作成できるという利点があります。

13
rism

___MigrationHistory_テーブルを削除するだけでした。

環境:

テーブルの名前を変更したときにこのエラーを受け取りました。注釈[Table("NewTableName")]をモデルの1つに追加した後、Entity Frameworkは___MigrationHistory_テーブルを生成しました。

4
Jared Beach

私は同じ問題を抱えていました-移行を再度追加してデータベースを更新しても機能せず、上記の答えはどれも正しくありませんでした。それからインスピレーションが私を襲った-私は複数の層(1つのWeb、1つのデータ、1つのビジネス)を使用しています。 Webレイヤーはこの例外をスローしませんでした-それはビジネスレイヤーでした(テストおよびデバッグ用のコンソールアプリケーションとして設定しました)。ビジネス層は、dbを取得してコンテキストを作成するために正しい接続文字列を使用していなかったことがわかります。そのため、接続文字列をアプリの構成とそれが機能するビオラに追加しました。同じ問題に遭遇するかもしれない他の人のためにこれをここに置いてください。

1
Richard Barker