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


85

まず第一に、私は他のどこでもこのエラーを見たことがなく、それは複製ではないと思うので、最初に全体の状況を読んでください。

すべてが正常に機能していたので、モデルクラスの1つ更新しようとしましたAppクラスで、更新はコメントのままになっています)。これを以下にリストします。そしてブーム私はこの醜いエラーがありました。


データベースが作成されてから、「ApplicationDbContext」コンテキストをサポートするモデルが変更されました。Code First Migrationsを使用してデータベースを更新することを検討してくださいhttp://go.microsoft.com/fwlink/?LinkId=238269)。System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.b__e()at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()atSystem.Data.Entity。 Internal.LazyInternalContext.b__4(InternalContext c)at System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 action)at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)at System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1.Microsoft.AspNet.Identityの1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryableSystem.Data.Entity.QueryableExtensions.Include [T、TProperty](IQueryable 1 source, Expression1パス)のSystem.Data.Entity.Infrastructure.DbQuery 1ソースのInclude(文字列パス)、文字列パス)。 EntityFramework.UserStore 6.GetUserAggregateAsync(ExpressionMicrosoft.AspNet.Identity.EntityFramework.UserStoreで1つのフィルタ)6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager前の位置からスタックトレースのMicrosoft.AspNet.Identity.UserManager`2.d__12.MoveNext()---終了時2.FindByNameAsync(文字列のuserName)ここで例外がスローされました--- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスクタスク)at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスクタスク)at ControlPanel.Web.Controllers.AccountController.d__2.MoveNext()in d :\ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs:line 56

最初は移行の問題かもしれないと思ったので、データベースを完全に削除し、移行を再度有効にして、Init移行を追加し、を使用してデータベースを更新しました。

update-database -force -verbose

すべてが問題なくうまくいきますが、自分のサイトにログインしようとすると、以前のエラーが発生します。問題を解決できずに、移行を約10回実行しました。

これが私のドメインクラス(モデル)です:

public class App
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int AppId { get; set; }
    //[Required]
    public virtual string FacebookId { get; set; }
    //[Required]
    public virtual string Secret { get; set; }      
    public virtual List<User> Users { get; set; }
    public virtual List<Post> Posts { get; set; }      
    //public virtual ApplicationUser Admin { get; set; }
}

public class Post
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int PostId { get; set; }
    public virtual string Content { get; set; }
    public virtual string Link { get; set; }
    public virtual string Image { get; set; }
    public virtual bool IsSpecial { get; set; }
    //[Required]
    public virtual App App { get; set; }
    //[Required]
    public virtual DateTime? PublishDate { get; set; }
}

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int UserId { get; set; }

    [MaxLength(500)]
    public virtual string FacebookId { get; set; }

    [MaxLength(500)]
    public virtual string Token { get; set; }

    //[Required]
    public virtual App App { get; set; }
}

これが私のIdentityModelsです:

public class ApplicationUser : IdentityUser
{
    public virtual List<App> Apps { get; set; }
    public bool? IsPremium { get; set; }
    [DataType(DataType.Date)]
    public DateTime? LastPublishDateTime { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("dCon")
    {
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("Admins");
        modelBuilder.Entity<ApplicationUser>().ToTable("Admins");
        modelBuilder.Entity<IdentityUserRole>().ToTable("AdminRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("Logins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("Claims");
        modelBuilder.Entity<IdentityRole>().ToTable("Roles");
    }
}

この問題を他の場所で見たことがないのですか?このリンクはどうですか?stackoverflow.com/questions/3600175/...
AndreCruz

4
いいえ、それらは私があなたに保証できるものと同じではありません、私はそこに提供された解決策を試しましたが結果はまったくありません、彼らのエラーは言う:データベースを手動で削除/更新するのに対し、私の言う:コードファーストマイグレーションの使用を検討データベースを更新するには
a7madx7 2014年

回答:


139

私のようなデータベースの最初の実装を行っていた誰かがこれに遭遇した場合に備えて。

ApplicationUserクラスを拡張し、AspNetUsersテーブルに新しいフィールドを追加して変更を加えたところ、起動時にこのエラーが発生しました。

__MigrationHistoryテーブルに作成されたレコードを削除することでこれを解決できました(レコードは1つしかありませんでした)EFは、移行ツールを使用してデータベースを更新する必要があると判断したと思いますが、これはすでに手動で行っていました。


1
データベースも最初に、これで修正されました。唯一のレコードは、コードを最初に実行した最初の作成でしたが、最初にデータベースを使用し、MSSQLサーバーのテーブルを変更した後に変更しました。
SolidSnake4444 2015

働いた。スキャフォールドビューを追加するとエラーが発生しました。ビューのデータコンテキストクラスApplicationDbContext
Vincent Saelzler 2016

78

これは私にとってはうまくいきました-他の変更は必要ありません。

DELETE FROM [dbo].[__MigrationHistory]

1
私のためにも働いた。非常に奇妙な修正。私は、歴史の中で壊れた移住があったと思います。すべての移行を削除して、最初の移行を再度作成しようとします。
hakan 2015

1
@Dave VoylesこのSQLはSSMSで直接実行できます
Daniel de Zwaan 2015年

1
私のためにも働いた。あるデータベースではこのテーブルが存在したが、別のデータベースでは存在しなかった
Tejas

1
私のコードは最後のモデル更新まで正常に実行されていたので、上記の回答は役に立ちません。あなたの答えはトリックをしました。乾杯!!
Sithu 2016

3
これは私には機能せず、データベースを削除し、移行を再実行して、データを再度追加する必要がありました。注意してください。
adamonstack 2017

35

この投稿は私の問題を修正しました。それはすべての中で、次の行を追加することについてですApplication_Start()Global.asax

Database.SetInitializer<Models.YourDbContext>(null);

ただし、モデルを編集するたびにデータベースが再作成され、データが失われる可能性があります。


4
データが破損したり失われたりしたくありません。
RoohullahAllemは2014

最善のアプローチではありません。ソリューションしかし、信頼性がない
Ahsanアフタブ

13

「データベース>システムテーブル」から「[__MigrationHistory]」テーブルを削除すると、機能します。


できます。ただし、[__MigrationHistory] テーブルを削除した後は、EDMXmmodelも更新してください。
DmitryBoyko 2018

12

それはとても奇妙なエラーでした、それは最後に私のエラーではありませんでした、それはマイクロソフトのものでした、私はエンティティフレームワークを「プレリリース」バージョンでインストールしました、そしてそれは私が安定版にアップグレードしたときにこのエラーの原因でした消えたリリース、、私がこの質問をしたときに私がその解決策を1週間ほど検索したとき、みんなが私を信じてくれてありがとう、私はこの問題が他のどこにもないと確信しています:エンティティframework.dllのバージョンが原因で問題は6.0.2でした。


12

このエラーで頭痛の種になる人は誰でも:すべてのプロジェクトが同じEntityFrameworkアセンブリへの参照を持っていることを絶対に確認してください。

短編小説:

モデルとアプリケーションは異なるアセンブリにありました。これらのアセンブリは、異なるバージョンのEntityFrameworkを参照していました。2つのバージョンが同じモデルに対して異なるIDを生成したと思います。そのため、アプリケーションを実行したときに、モデルのIDが__MigrationHistoryの最新の移行のIDと一致しませんでした。最新のEFリリースへのすべての参照を更新した後、エラーが再び表示されることはありませんでした。


はい、それは私の場合でした。ほとんどのプロジェクトはef6.1.3を使用していましたが、新しく作成されたテストプロジェクトはどういうわけかef6.0を使用していました。
ZZZ 2017年

7

私はこの問題を解決するために何日も費やし、多くの異なる投稿を分析し、多くのオプションを試し、最終的に修正しました。 この2つのプロジェクトでは、EFコードの最初の移行を使用しています。

  • すべてのコードファーストエンティティ、DbContext、Mirgations、およびジェネリックリポジトリを含むアセンブリとして主に使用するコンソールアプリケーション「DataModel」。パッケージマネージャーコンソールから移行を生成できるように、このプロジェクトに別の空のローカルデータベースファイル(DataModel / App_Dataフォルダー内)を含めました。
  • WebApiは、DataModelプロジェクトを参照し、プロジェクトに含まれていないWebApi / App_Dataフォルダーのローカルデータベースファイルを使用します。

WebApiをリクエストするとこのエラーが発生しました...

私の環境:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional with Update 1
  • .NET Framework4.6.1を対象としたすべてのプロジェクト
  • NuGetのEntityFramework6.1.3

ここで私はあなたが注意を払うべきすべての意見と言及された例外を避けるために満たされなければならないすべての条件/要件を集めました:

  1. ソリューション内のすべてのプロジェクトには、1つのバージョンのEntityFrameworkNugetパッケージのみを使用する必要があります。
  2. すべての移行スクリプトを順番に実行して作成されたデータベースは、ターゲットデータベースと同じ構造/スキーマを持ち、エンティティモデルに対応している必要があります。次の3つのことは、互いに正確に対応/反映/一致する必要があります。
    • 最後までのすべての移行スクリプト
    • 現在のコードの最初のエンティティモデルの状態(DbContext、エンティティ)
    • ターゲットデータベース
  3. ターゲットデータベース(mdfファイル)は、最後の移行スクリプトまで更新/対応する必要があります。ターゲットデータベースの「__MigrationHistory」テーブルに、所有しているすべての移行スクリプトのレコードが含まれていることを確認します。これは、すべての移行スクリプトがそのデータベースに正常に適用されたことを意味します。Visual Studioを使用して、データベースに対応する正しいコードファーストエンティティとコンテキストを生成することをお勧めします。プロジェクト->新しいアイテムの追加-> ADO.NETエンティティデータモデル->データベースからのコードファースト: もちろん、代替手段として、手動でモデルを作成し(最初のエンティティとコンテキストをコーディング)、最初の移行とデータベースを生成できるデータベースがありません。
  4. 接続文字列の名前(例:スタートアッププロジェクトの構成ファイル(Web.config / App.config)のMyConnectionString):

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>
    

    DbContextのコンストラクターで渡されるパラメーターと同じである必要があります。

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. パッケージマネージャーコンソールを使用する前に、更新または移行の生成に正しいデータベースを使用しており、必要なプロジェクトがソリューションのスタートアッププロジェクトとして設定されていることを確認してくださいデータベースに接続するには、その.configファイルの接続文字列を使用します。このファイルは、プロジェクトでは、スタートアッププロジェクトとして設定されています。
  6. そして、私の問題を修正したメイン:それは奇妙ですが、私のWebApi / binフォルダーではDataModel.exeが古く、前回のビルド以降更新されていません。移行はアセンブリDataModel.exeに埋め込まれているため、WebApiは古い移行を使用してデータベースを更新しました。WebApiでデータベースを更新した後、DataModelからの最新の移行スクリプトに対応しない理由がわかりませんでした。次のコードは、WebApi / App_Dataフォルダーに最新の移行ローカルデータベースを自動的に作成(存在しない場合)または更新します。

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...
    

    私はソリューションをクリーンアップして再構築しようとしましたが、WebApiからbinフォルダーとobjフォルダーを完全に削除し、WebApi / App_Dataからデータベースファイルを削除し、WebApiをビルドして再起動し、要求を行い、正しいデータベースを作成しました-遅延初期化(上記の行)、これは最新の移行に対応し、例外はこれ以上表示されませんでした。 だから、これはあなたの問題を解決するかもしれません:

    1. スタートアッププロジェクト(データベースを生成/更新する)からbin、objフォルダーを手動で削除します
    2. スタートアッププロジェクトを構築するか、すべてのソリューションをクリーンアップして再構築します。
    3. プロジェクトを開始してデータベースを再作成するか(上記の行を実行します)、パッケージマネージャーコンソールの「update-database」コマンドを使用します。
    4. 生成されたdbと__MirgationHistoryが最新の移行スクリプトに対応しているかどうかを手動で確認します。

3

これは、モデルプロパティのデータ注釈を変更したときに発生する可能性があります。例:プロパティに[必須]を追加すると、データベース設計に保留中の変更が発生します。

最も安全な解決策は、パッケージマネージャーコンソールで実行することです。

add-migration myMirgrationName

これにより、Up()メソッドの正確な変更が表示されます。したがって、次の方法でそのような変更を本当に適用するかどうかを決定できます。

update-database

それ以外の場合は、__ MigrationHistoryテーブルとMigrationsフォルダーからSolutionExplorerから最新の移行を削除できます。


これは間違いなく私がここで見た最良の答えです。移行履歴を削除するという提案は、私の意見では非常に悪い考えです。
mgrenier 2018年

ご意見をありがとうございます。また、通常、移行履歴を削除することはお勧めしませんが、特定のケースでは、以前の移行ポイントにそれほど違いはありませんでした。つまり、OPによってモデルの変更があまり行われていなかったため、1ステップ戻ると役立つと思いました。 、最後の移行レコードのみを削除します。
Mohamed Nagieb 2018年

2

私はa7madx7と同じ問題を抱えていましたが、EF(v6.1.1)の安定したリリースで、解決策が次の場所に掲載されていました。

http://cybarlab.com/context-has-changed-since-the-database-was-created

バリエーションあり:http//patrickdesjardins.com/blog/the-model-backing-the-context-has-changed-since-the-database-was-created-ef4-3

2番目のリンクには、VBに関する具体的な言及が含​​まれています..... 「この問題が発生しているすべてのdatabasecontextを、次のようにglobal.asaxファイルのapp_startメソッドに追加するだけです」

Database.SetInitializer(Of DatabaseContext)(Nothing)

注意:「DatabaseContext」をDbContextを実装するクラスの名前に置き換える必要がありました

更新:また、コードファーストアプローチを使用して既存のテーブルに接続する場合は、データベースをチェックして、EFがマッピングを格納するためのテーブル「_migrationhistory」を作成したかどうかを確認します。このテーブルの名前を変更すると、global.asaxからSetInitializerを削除できました。


2

データベースの_MigrationHistoryにある移行履歴を削除するだけです。それは私のために働いた


1

ウェブサイトフォルダ内のすべてのファイルを削除してから再公開することで、同様の問題を解決しました。


1

すべてのテーブルIDを削除します

Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser

1

[ツール]メニューから、[NuGetパッケージマネージャー]をクリックし、[パッケージマネージャーコンソール(PMC)]をクリックします。PMCに次のコマンドを入力します。

Enable-Migrations Add-Migration InitUpdate-Databaseアプリケーションを実行します。 問題の解決策はここからです


1

開発中は、この実用的なクラスを使用して移行を構成することを好みます。

それが役に立てば幸い。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
        this.Configuration.LazyLoadingEnabled = false;
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        Database.SetInitializer(new StackOverflowInitializer());
    }

    public class StackOverflowInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
    {
        public StackOverflowInitializer()
        {
            // TODO NOTHING, COMMENT ALL

            // IF CHANGES, RECREATE
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ApplicationDbContext>());

            // CREATE ONLY NOT EXITS
            //Database.SetInitializer<Context>(new CreateDatabaseIfNotExists<ApplicationDbContext>());
        }

    }

    public System.Data.Entity.DbSet<stackoverflow.Models.Company> Companies { get; set; }

}

0

古いproductVersionで[__MigrationHistory]テーブルの行を削除するとうまくいきました。この回答は、[__ MigrationHistory]テーブル全体を削除したくない人向けです。ProductVersion列の古いバージョンの行を削除するだけです。それが誰かを助けることを願っています!


0

以下は私が遭遇した同様の種類のエラーでした

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

エラーを解決するために、Global.asaxのApplicationStartイベントに以下のセクションを追加しました

Database.SetInitializer(null);

これで問題が修正されました


0

単にエラーは、モデルに変更があり、DBと同期していないことを意味するため、パッケージマネージャーコンソールに移動します。 add-migration foo2 これにより、問題の原因のヒントが表示されます。何かを削除したか、私の場合はデータ注釈を削除します。 。そこから変更を取得し、できればモデルで元に戻すことができます。

その後、foo2を削除します。


0

遅刻していることは承知していますが、貢献したいと思います。クラスとそのプロパティが変更された可能性があるがデータベースにコミットされていないため、ブラウザは変更のレンダリング方法を理解できないため、このエラーは非常に奇妙です。

だから一つのことをしなさい、

次のコマンドを使用して、パッケージマネージャーコンソール([ツール]> [NuGetパッケージマネージャー]> [パッケージマネージャーコンソール])で1つの移行を作成します。

add-migration UpdateMigration

ここで、UpdateMigrationは移行の名前です。任意の名前を付けることができますが、具体的にしてください。

その後、データベースを更新する必要があるので、これを実行します。

データベースを更新する

データベースへの変更をコミットしたので、ブラウザを更新するだけです。

お役に立てれば。


0

これは、モデルの1つにプロパティを追加し、追加しなかったためupdate-Databaseです。これを解決するには、モデルから削除するかadd-migration anyProperName 、そのプロパティとを使用する必要がありUpdate-databaseます。


0

このエラーは、モデルに変更を加え、データベースを更新するための変更を移行しなかったときに発生しました。

Code First MigrationSchemaでモデルに変更を加えたことがある場合

移行を追加することを忘れないでください

add-migration UpdatesToModelProperites 

上記のコマンドは、モデルに加えたすべての変更を読み取り、Up()メソッドとDown()メソッドに書き込みます。

次に、以下のコマンドを使用してデータベースを更新するだけです。

update-database

これは私のために働いたものです。


-2

既存のデータベースを削除し、同じ名前で新しいデータベースを作成し、すべてのデータをコピーします...それは機能します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.