0

私のコードでは、「mycontext.Database.CompatibleWithModel(true)」を使用して、エンティティ フレームワークの Code First モデルと Sql Azure データベースが同期しているかどうかを確認しようとしています。ただし、非互換性がある場合、この行は次の例外で失敗します。

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

非互換性の結果としてチェック自体が失敗しているため、これはチェックの目的を無効にしているようです。

さまざまな理由から、私は Database.SetInitializer アプローチを使用したくありません。

助言がありますか?

これは特定の SQL Azure の問題ですか?

ありがとうマーティン

4

1 に答える 1

0

以下の ScottGu ブログをチェックしてください。

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

何が起こっているのか、それについて何をすべきかは次のとおりです。

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

Database.SetInitializer<Production>(null);

上記のコードを使用すると、既存のデータベースを使用する代わりにデータベースを再作成するのではないため、Database.SetInitializer の使用について真剣に考えていない限り、問題になるとは思いません。

詳細: Entity Framework コードのみのエラー: データベースが作成されてからコンテキストをサポートするモデルが変更されました

于 2012-05-31T06:22:02.147 に答える