61

データベースが作成されてから、「MyDbContext」コンテキストをサポートするモデルが変更されました。Code First Migrationsを使用してデータベースを更新することを検討してください(http://go.microsoft.com/fwlink/?LinkId=238269)。

これが起こる原因は何ですか?文字通り新しいデータベースを作成したばかりで、何も変更していませんが、コントローラーからモデルにアクセスしようとするたびに、これがスローされます。

編集

これは、接続文字列(つまりデータベース)を2つの別々のエンティティと共有しようとしていたという事実と関係があります。

4

14 に答える 14

61

私の場合、このエラーはデータベースに_MigrationsHistoryテーブルが存在することが原因で発生しました。そのテーブルを削除すると、問題が修正されました。そのテーブルがテスト環境データベースにどのように組み込まれたかはわかりません。

于 2016-05-27T17:00:14.147 に答える
48

EF codefirstは、DbContextを調べ、そこで宣言されているすべてのエンティティコレクションを検出します(また、ナビゲーションプロパティを介してそれらのエンティティに関連するエンティティも調べます)。次に、接続文字列を指定したデータベースを調べ、そこにあるすべてのテーブルがモデル内のエンティティの構造と一致していることを確認します。それらが一致しない場合、それらのテーブルに対して読み取り/書き込みを行うことはできません。新しいデータベースを作成するとき、またはプロパティの追加やデータ型の変更など、エンティティクラス宣言について何かを変更すると、モデルとデータベースが同期していないことが検出されます。デフォルトでは、上記のエラーが発生するだけです。通常、開発中に実行したいのは、データベースを再作成(データを消去)して、新しいモデル構造から再生成することです。

これを行うには、この記事の「RecreateDatabaseIfModelChanges機能」を参照してください: http ://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

基本的に、DropCreateDatabaseIfModelChangesから継承するデータベース初期化子を提供する必要があります(RecreateDatabaseIfModelChangesは非推奨になりました)。これを行うには、この行をファイルのApplication_Startメソッドに追加するだけです。Global.asax

Database.SetInitializer<NameOfDbContext>(new DropCreateDatabaseIfModelChanges<NameOfDbContext>());

本番環境に移行してデータを失いたくない場合は、この初期化子を削除し、代わりにデータベース移行を使用して、データを失うことなく変更をデプロイできるようにします。

于 2013-02-19T01:38:13.250 に答える
38

このエラーを解決するには、Global.asax.csファイルのApplication_Start()メソッドに次のコードを記述します。

Database.SetInitializer<MyDbContext>(null);
于 2014-09-11T07:59:17.523 に答える
12

コンテキストに変更を加え、DBに関連する変更を手動で行いたい(またはそのままにしておきたい)場合は、高速で汚い方法があります。

DBに移動し、「_MigrationHistory」テーブルからすべてを削除します

于 2016-09-10T12:54:03.413 に答える
8

最も簡単で安全な方法 データベースがDBContextと同期できるように、データ構造を本当に変更/更新したいことがわかっている場合、最も安全な方法は次のとおりです。

  1. パッケージマネージャーコンソールを開きます
  2. タイプ:update-database -verbose -force

これにより、データベースがDBContextデータ構造と一致するようにデータベースに変更を加えるようにEFに指示されます。

于 2016-10-15T03:23:42.003 に答える
4

Package Manage Consoleに移動し、次のように入力します。

有効化-移行

*このようなエラーが表示された場合「保留中の変更があり、自動移行が無効になっているため、現在のモデルに一致するようにデータベースを更新できません。保留中のモデル変更をコードベースの移行に書き込むか、自動移行を有効にしてください。」

これを行う>>>追加-移行

* Visual Studioは名前を尋ねますので、ご希望の名前を入力してください。

データベースを更新する

于 2019-08-31T16:27:32.673 に答える
3

これを別の可能な解決策として追加します。これが私たちの場合にそれを修正したものだからです。

複数のプロジェクトがある場合は、それらが同じEntityFrameworkNugetパッケージバージョンを使用していることを確認してください。

この例では、すべてのエンティティでEFコードの最初のコンテキストを保持する1つのプロジェクト(プロジェクトAの場合は呼び出し)がありました。移行の追加とデータベースの更新に使用していたのはこのプロジェクトでした。ただし、2番目のプロジェクト(B)は、コンテキストを利用するためにプロジェクトAを参照していました。このプロジェクトを実行すると、同じエラーが発生しました。

データベースが作成されてから、「MyDbContext」コンテキストをサポートするモデルが変更されました。Code First Migrationsを使用してデータベースを更新することを検討してください(http://go.microsoft.com/fwlink/?LinkId=238269)。

于 2018-12-03T13:35:49.430 に答える
3

__MigrationHistoryデータベースに自動的に作成され、コードファーストの移行を使用してデータベースの更新をログに記録するテーブルを削除することで、問題を修正できます。ここで、この場合、データベースを手動で変更しましたが、EFは移行ツールを使用して変更する必要があると想定していました。テーブルを削除するということは、EFにとって、更新がなく、コードファーストの移行を行う必要がないことを意味します。したがって、完全に正常に機能します。

于 2019-09-25T08:19:24.127 に答える
2

このエラーは、データベースがモデルと同期していない場合、またはその逆の場合に発生します。これを克服するには、以下の手順に従ってください-

a)nugetパッケージマネージャーコンソールからadd-migration <{MigrationFileName}>を使用して移行ファイルを追加します。この移行ファイルには、Dbとコードの間で同期していないものを同期するためのスクリプトが含まれています。

b)update-databaseコマンドを使用してデータベースを更新します。これにより、モデルの最新の変更でデータベースが更新されます。

これで問題が解決しない場合は、Global.asax.csファイルのApplication_Startメソッドにコード行を追加してからこれらの手順を試してください-

Database.SetInitializer<VidlyDbContext>(new DropCreateDatabaseIfModelChanges<VidlyDbContext>());

参照-http://robertgreiner.com/2012/05/unable-to-update-database-to-match-the-current-model-pending-changes/

于 2018-09-24T10:33:02.587 に答える
1

これは、テーブル構造とモデルクラスが同期しなくなったときに発生します。モデルクラスに従ってテーブル構造を更新する必要があります。その逆も同様です。これは、データが重要であり、削除してはならない場合です。データ構造が変更され、データが重要でない場合は、 Global.asax.csに次のコードを追加することで、このDropCreateDatabaseIfModelChanges機能(以前は''機能と呼ばれていました)を使用できます。RecreateDatabaseIfModelChanges

Database.SetInitializer<MyDbContext>(new DropCreateDatabaseIfModelChanges<MyDbContext>());

アプリケーションを再度実行します。

名前が示すように、これによりデータベースが削除され、最新のモデルクラス(または複数のクラス)に従って再作成されます。ただし、モデルクラスのテーブル構造定義が最新で最新であると思われる場合に限ります。それ以外の場合は、代わりにモデルクラスのプロパティ定義を変更してください。

于 2015-05-05T19:16:38.887 に答える
1

すでに存在するテーブルを使用してモデルとデータベースを変更し、「DBコンテキストをサポートするモデルが変更されました。コードファーストマイグレーションを検討してください」というエラーが表示された場合は、次のことを行う必要があります。

  • プロジェクトの「Migration」フォルダの下にあるファイルを削除します
  • パッケージマネージャーコンソールを開き、実行しますpm>update-database -Verbose
于 2015-07-17T22:40:32.697 に答える
1

Entity Frameworkは、モデルに関する何かが変更されたことを検出します。これを機能させるには、データベースに対して何かを行う必要があります。解決策:1enable - migrations2 。データベースを更新する

于 2016-11-03T15:33:29.943 に答える
0

あなたは私を信じる必要があります。スタートアッププロジェクトのApp.Config(私のものはwpfプロジェクトです)に接続文字列を追加するのを忘れたという単純な理由で、このエラーが発生しました。

私の場合は設定全体

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="ZzaDbContext" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=ZaaDbInDepth;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
于 2017-09-09T15:42:08.353 に答える
0

IDを使用する場合は、コンテキスト名がmigrationHistoryの最後のレコードのコンテキストキーと異なる可能性があります。したがって、コードのこの部分で、ContextKeyの新しい名前で名前を変更する必要があります。

         Database.SetInitializer<ContextName>(null);
于 2021-11-29T19:15:10.680 に答える