.net - 自创建数据库以来,支持'ApplicationDbContext'上下文的模型已更改

首先,我没有在其他地方看到过这个错误,我猜它不是复制品,所以请先阅读整个情况。

一切都工作得很好,然后我尝试更新我的一个模型类(App类和更新现在留下评论),我将在下面列出并繁荣我有这个丑陋的错误。


自创建数据库以来,支持'ApplicationDbContext'上下文的模型已更改。考虑使用Code First Migrations在System.Data.Entity.Internal的System.Data.Entity.CreateDatabaseIfNotExists1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.b__e()处更新数据库([http://go.microsoft.com/fwlink/?LinkId=238269).)。位于System.Data.Entity.InternalContext.Interialization()的System.Data.Entity.InternalContext.b__4(InternalContext c)System.Data.Entity.Internal.RetryAction1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 action在System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()处于System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)的System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1 .Include(String path)at System .Data.Entity.Infrastructure.DbQuery1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable1 source,String path)at System.Data.Entity.QueryableExtensions.Include [T,TProperty](IQueryable1 source, Expression1 path)at Microsoft.AspNet.Identity.EntityFramework.UserStore252 Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext()上的Microsoft.AspNet.Identity.EntityFramework.UserStore6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager2.FindByNameAsync(String userName)的95776337934428211过滤器---从抛出异常的上一个位置开始的堆栈跟踪结束 - - 位于System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于d:\ Projects \中的ControlPanel.Web.Controllers.AccountController.d__2.MoveNext() FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs:第56行

起初我认为这可能是一个迁移问题,因此我完全删除了数据库,重新启用了迁移,并添加了Init迁移并使用了更新数据库

update-database -force -verbose

每件事都没有投诉,但每当我尝试登录我的网站时,我都会收到上一个错误。 我做了大约十次移植的事情而没能解决问题。

这是我的域类(模型):

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");
    }
}
19个解决方案
131 votes

以防万一其他人偶然发现像我这样的数据库第一次实现。

我通过扩展__MigrationHistory类进行了更改,向AspNetUsers表添加了一个新字段,然后在启动时出现此错误。

我能够通过删除在__MigrationHistory表中创建的记录来解决这个问题(那里只有一条记录)我假设EF决定我需要使用迁移工具更新我的数据库 - 但我已经自己手动完成了这个。

Josh answered 2019-09-17T09:25:56Z
68 votes

这对我有用 - 无需其他更改。

DELETE FROM [dbo].[__MigrationHistory]
Daniel de Zwaan answered 2019-09-17T09:26:22Z
31 votes

这篇文章解决了我的问题。 这是关于在Database.SetInitializer<Models.YourDbContext>(null);中的Database.SetInitializer<Models.YourDbContext>(null);中添加以下行:

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

但是,它会导致模型中每次编辑的数据库重新创建,并且您可能会丢失数据。

Amin Saqi answered 2019-09-17T09:27:00Z
11 votes

这是一个奇怪的错误,这不是我最后的错误,它是微软的,我安装了实体框架的“预发布”版本,它负责这个错误,当我升级到稳定 释放它消失,谢谢大家相信我,当我问这个问题我搜索了一个星期左右的解决方案所以我很确定这个问题不是其他地方:实体framework.dll的版本导致了 问题是6.0.2,如果它有帮助。

a7madx7 answered 2019-09-17T09:27:27Z
11 votes

每个人都会对此错误感到头疼:确保所有项目都引用相同的Entity Framework程序集。

短篇小说:

我的模型和我的应用程序在不同的程序集中。 这些程序集引用了不同版本的Entity框架。 我猜这两个版本为同一个modell生成了不同的id。 因此,当我的应用程序运行时,模型的id与__MigrationHistory中的最新迁移不匹配。 更新所有对最新EF版本的引用后,错误再也没有出现过。

Hari answered 2019-09-17T09:28:06Z
10 votes

如果从“数据库>系统表”中删除“[__MigrationHistory]”表,那么它将起作用。

Aniket Sharma answered 2019-09-17T09:28:34Z
7 votes

我花了很多天时间来解决这个问题,分析了许多不同的帖子并尝试了很多选项并最终修复了。这2个项目在我的解决方案中使用EF代码首次迁移:

  • 控制台应用程序“DataModel”主要使用as作为程序集,其中包含我的所有代码第一个实体,DbContext,Mirgations和通用存储库。 我已经在此项目中包含了单独的空本地数据库文件(在DataModel / App_Data文件夹中),以便能够从Package Manager控制台生成迁移。
  • WebApi,引用数据模型项目并使用Web Api / App_Data文件夹中的本地数据库文件,不包含在项目中

请求WebApi时出现此错误...

我的环境:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional,更新1
  • 我的所有项目都针对.NET Framework 4.6.1
  • 来自NuGet的EntityFramework 6.1.3

在这里,我收集了您应该注意的所有评论以及必须满足的所有条件/要求,以避免提到的异常:

  1. 对于解决方案中的所有项目,您应该只使用一个版本的EntityFramework Nuget包。
  2. 通过顺序运行所有迁移脚本创建的数据库应具有与目标数据库相同的结构/模式,并对应于实体模型。 以下3件事必须完全对应/反映/相互匹配:
    • 您的所有迁移脚本最后都是
    • 当前代码第一个实体模型状态(DbContext,实体)
    • 目标数据库
  3. 目标数据库(mdf文件)应该更新/对应于上一个迁移脚本。 验证目标数据库中的“__MigrationHistory”表是否包含您拥有的所有迁移脚本的记录,这意味着所有迁移脚本都已成功应用于该数据库。 我建议您使用Visual Studio生成正确的代码第一个实体和与您的数据库对应的上下文,Project - > Add New Item - > ADO.NET Entity Data Model - > Code First from database:当然,作为替代方案,如果您没有数据库,则可以手动编写模型(代码优先实体和上下文),然后生成初始迁移和数据库。
  4. 连接串的名称,例如 启动项目的配置文件中的MyConnectionString(Web.config / App.config):

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

    应该等于在DbContext的构造函数中传递的参数:

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...
    
  5. 在使用Package Manager控制台之前,请确保使用正确的数据库进行更新或生成迁移,并将所需项目设置为解决方案的启动项目。 对于连接到数据库,它将使用该.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是否与最新的迁移脚本相对应。
Sergey Kulgan answered 2019-09-17T09:32:00Z
2 votes

我遇到了与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]

第二个链接包括对VB的具体提及.....“你可以简单地在global.asax文件中添加所有在app_start方法上遇到此问题的databasecontext”:

Database.SetInitializer(Of DatabaseContext)(Nothing)

注意:我不得不用实现DbContext的类的名称替换“DatabaseContext”

更新:此外,当使用codefirst方法连接到现有表时,请检查数据库以查看EF是否已创建表“_migrationhistory”来存储映射。 我重新命名此表然后能够从global.asax中删除SetInitializer。

user3085342 answered 2019-09-17T09:32:59Z
2 votes

更改模型属性的数据注释时可能会发生这种情况。 例如:将[Required]添加到属性将导致数据库设计中的挂起更改。

最安全的解决方案是在Package Manager控制台上运行:

add-migration myMirgrationName

这将显示Up()方法中的确切更改。 因此,您可以通过以下方式决定是否确实要应用此类更改:

update-database

否则,您可以从__MigrationHistory表和“解决方案资源管理器”的“迁移”文件夹中删除最新的迁移。

Mohamed Nagieb answered 2019-09-17T09:33:46Z
1 votes

我刚刚通过删除网站文件夹中的所有文件解决了类似的问题,然后重新发布。

Daniel Björk answered 2019-09-17T09:34:12Z
1 votes

删除所有表标识

Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser
Majid joghataey answered 2019-09-17T09:34:38Z
1 votes

从“工具”菜单中,单击“NuGet包管理器”,然后单击“包管理器控制台”(PMC)。 在PMC中输入以下命令。

启用的迁移添加迁移初始化更新数据库运行该应用程序。问题的解决方案来自这里

Sultan answered 2019-09-17T09:35:11Z
0 votes

使用较旧的productVersion删除[__MigrationHistory]表中的行对我有用。 这个答案适用于那些不想删除整个[__MigrationHistory]表的人。 只需在ProductVersion列中删除旧版本的行即可。 希望它有所帮助!

Rajon Tanducar answered 2019-09-17T09:35:37Z
0 votes

在开发时,我更喜欢使用这个实用的类来配置迁移。

希望能帮助到你。

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; }

}
Andre Mesquita answered 2019-09-17T09:36:08Z
0 votes

下面是我遇到的类似错误

自创建数据库以来,支持'PsnlContext'上下文的模型已更改。 请考虑使用“代码优先迁移”来更新数据库([http://go.microsoft.com/fwlink/?LinkId=238269]。]

我在Global.asax的Application Start事件中添加了以下部分来解决错误

Database.SetInitializer(空值);

这解决了这个问题

Lati answered 2019-09-17T09:36:59Z
0 votes

只需删除DataBase中_MigrationHistory中的迁移历史记录即可。 它对我有用

k.demas answered 2019-09-17T09:37:26Z
0 votes

只是错误意味着您的模型已更改,并且与DB不同步,因此去包管理器控制台,add-migration foo2这将暗示导致问题的原因,可能是你删除了一些东西,或者在我的情况下我删除了一个数据注释。从那里你可以得到改变,并希望在你的模型中扭转它。

之后删除foo2。

Yusufm.Salh answered 2019-09-17T09:38:04Z
-1 votes

删除现有数据库,创建具有相同名称的新数据库,复制所有数据......它将起作用

faux answered 2019-09-17T09:38:32Z
-1 votes

在“Global.asax.cs”中的“Application_Start”内添加以下行

Database.SetInitializer<YourDbContext>(new DropCreateDatabaseIfModelChanges<YourDbContext>());
M Nazeer answered 2019-09-17T09:38:59Z
translate from https://stackoverflow.com:/questions/22408608/the-model-backing-the-applicationdbcontext-context-has-changed-since-the-datab