web-dev-qa-db-ja.com

データベースが作成されてから、「DataContext」コンテキストを支えるモデルが変更されました

マイグレーションでコードファーストを使用しようとしています。モデルに現在の変更はありませんが、例外が発生します。マイグレーションを追加すると、アップとダウンは空になりますが、次のようなメッセージで実行時エラーが発生します。

EntityFramework.dllでタイプ「System.InvalidOperationException」の例外が発生しましたが、ユーザーコードでは処理されませんでした

追加情報: 'MyDataContext'コンテキストをサポートするモデルは、データベースの作成後に変更されました。 Code First Migrationsを使用してデータベースを更新することを検討してください( http://go.Microsoft.com/fwlink/

私のアーキテクチャは次のとおりです:

  • コンテキスト、流動的な構成、移行コードを含むDataAccessプロジェクト
  • Pocoクラスを含むモデルプロジェクト
  • それぞれが対応するweb.configファイルに接続文字列を含むWeb APIおよびMVCプロジェクト。

さらに、次のコードがあります。

DbInitializer

public static MyDataContext Create()
{
   Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataAccess.MyDataContext, MyDataAccess.Migrations.Configuration>());
   return new MyDataContext(ConfigurationManager.ConnectionStrings["MyDataContext"].ConnectionString, null);
}

私はAutomaticMigrationsEnabled = falseから始めました。これは、マイグレーションがいつ適用されるかをより詳細に制御できるようにする(そして要求する)ことを理解していたため、マイグレーション構成コンストラクターで。これをtrueに設定してみましたが、結果は同じです。

このエラーを受け取ったときに新しい移行を追加しましたが、Upメソッドは空でした。データベースをこの新しい移行に更新し、_migrationHistoryテーブルにレコードを作成しましたが、アプリケーションを実行しようとするとエラーが発生します。また、シードデータはデータベースに追加されませんでした。

protected override void Seed(MyDataAccess.MyDataContext context)
{
            IdentityResult ir;

            var appDbContext = new ApplicationDbContext();
            var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(appDbContext));
            ir = roleManager.Create(new IdentityRole("Admin"));
            ir = roleManager.Create(new IdentityRole("Active"));
            ir = roleManager.Create(new IdentityRole("InActive"));

            var userNamager = new UserManager<User>(new UserStore<User>(appDbContext));

            //  assign default admin
            var admin = new User { UserName = "administrator", Email = "[email protected]" };
            ir = userNamager.Create(admin, "myp@55Word");

            ir = userNamager.AddToRole(admin.Id, "Admin");
 }

どこ

public class ApplicationDbContext : IdentityDbContext<User>
{
    public ApplicationDbContext()
        : base("MyDataContext", throwIfV1Schema: false)
    {
    }
    ...

質問:Add-Migrationでモデルに変化が見られない場合、実行するとこのエラーが発生するのはなぜですか?シードコードがヒットしないのはなぜですか?これを修正するにはどうすればよいですか、またはそれを特定できない場合は、根本的な原因をさらに特定するにはどうすればよいですか?

12
Steve Wash

これでうまくいきました。

パッケージマネージャーコンソールに移動して実行-Update-Database -force

7
Kyle Johnson

あなたが問題の答えを見つけたかどうかはわかりませんが、ここで私が見つけたこの別の答えは実際に私のためにそれを行いました: Entity Frameworkモデル変更エラー

SQL Serverの___MigrationHistory_テーブルを実際に削除してしまいましたが、テーブルが自動的に作成されていることを知りませんでした。

この記事では、この命令を使用して生成しないオプションについても説明しています。Database.SetInitializer<MyDbContext>(null);は使用していません。そのように機能するかどうかはわかりません

19
Oscar

記述されている here のように、有効になっている自動移行と初期化子MigrateDatabaseToLatestVersionの間で競合が発生しました。

0
Steve Greene

私はあなたのデータコンテキストが接続文字列をフックアップしていないに違いない。それがlocaldb((localdb)\v11.0のようなもの)で初期化されておらず、他の何かに設定されていると思われる場合はそれで動作しないことを確認してください。

0
George Polevoy