19

驚いたことに、CreateDatabaseIfNotExistsコンテキスト初期化子を使用して、次の行

context.Database.Initialize(true)

スキーマがコードの最初のスキーマと一致しない場合、例外はスローされません。

たとえば、テーブルがデータベースに存在しなくなり、EF によって例外がスローされるエンティティにアクセスしようとする前に、現在のデータベースがスキーマと一致するかどうかを検証する方法はありますか?

4

3 に答える 3

21

CompatibleWithModel を呼び出して、データベースがモデルと一致するかどうかを判断できます。パラメータを true に設定すると、データベースにモデル データが見つからない場合に例外がスローされます。

bool isCompatible = context.Database.CompatibleWithModel(true);
于 2014-08-22T11:11:35.820 に答える
8

EFは、アプリケーションを起動するたびにデータベーススキーマとモデルをクロスチェックしません。代わりに、データベースに保存されているモデル(__MigrationsHistoryテーブルおよびEdmMetadataの前)を探し、この保存されたモデルを使用しているモデルと比較します。モデルが一致する場合、データベースが使用されます。モデルが一致しない場合、例外がスローされます。データベースに__MigrationHistoryテーブルもEdmMetadataテーブルもない場合、EFは、DbContextでデータベースファーストアプローチを使用しており、データベースがモデルと一致していると見なします。データベースをモデルと比較する場合は、モデルのEdmxをダンプし(EdmxWriter.WriteEdmxを使用)、Visual StudioとEFデザイナーを使用してデータベースからEdmxを取得し、SSDLパーツを比較します。

于 2012-10-26T15:46:10.867 に答える