驚いたことに、CreateDatabaseIfNotExistsコンテキスト初期化子を使用して、次の行
context.Database.Initialize(true)
スキーマがコードの最初のスキーマと一致しない場合、例外はスローされません。
たとえば、テーブルがデータベースに存在しなくなり、EF によって例外がスローされるエンティティにアクセスしようとする前に、現在のデータベースがスキーマと一致するかどうかを検証する方法はありますか?
驚いたことに、CreateDatabaseIfNotExistsコンテキスト初期化子を使用して、次の行
context.Database.Initialize(true)
スキーマがコードの最初のスキーマと一致しない場合、例外はスローされません。
たとえば、テーブルがデータベースに存在しなくなり、EF によって例外がスローされるエンティティにアクセスしようとする前に、現在のデータベースがスキーマと一致するかどうかを検証する方法はありますか?
CompatibleWithModel を呼び出して、データベースがモデルと一致するかどうかを判断できます。パラメータを true に設定すると、データベースにモデル データが見つからない場合に例外がスローされます。
bool isCompatible = context.Database.CompatibleWithModel(true);
EFは、アプリケーションを起動するたびにデータベーススキーマとモデルをクロスチェックしません。代わりに、データベースに保存されているモデル(__MigrationsHistoryテーブルおよびEdmMetadataの前)を探し、この保存されたモデルを使用しているモデルと比較します。モデルが一致する場合、データベースが使用されます。モデルが一致しない場合、例外がスローされます。データベースに__MigrationHistoryテーブルもEdmMetadataテーブルもない場合、EFは、DbContextでデータベースファーストアプローチを使用しており、データベースがモデルと一致していると見なします。データベースをモデルと比較する場合は、モデルのEdmxをダンプし(EdmxWriter.WriteEdmxを使用)、Visual StudioとEFデザイナーを使用してデータベースからEdmxを取得し、SSDLパーツを比較します。