自创建数据库以来,支持“ ApplicationDbContext”上下文的模型已更改


85

首先,在其他任何地方都没有看到此错误,我想这不是重复错误,因此请先阅读整个情况。

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


自创建数据库以来,支持“ ApplicationDbContext”上下文的模型已更改。考虑使用“代码优先迁移”来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。System.Data.Entity.CreateDatabaseIfNotExists1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf上的System.Data.Entity.Internal.InternalContext.PerformInitializationAction(b)处的System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()处的Action动作。 System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1动作的Internal.LazyInternalContext.b__4(System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()的System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type)实体类型)位于System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1.System.Data.Entity.Infrastructure.DbQuery的1.Include(String路径),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路径)处的String路径。6.GetUserAggregateAsync(ExpressionMicrosoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager2.FindByNameAsync(String userName)在Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext()的EntityFramework.UserStore 1筛选器)---从上一个位置开始的堆栈跟踪结束在d的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的ControlPanel.Web.Controllers.AccountController.d__2.MoveNext()中引发了异常:\ Projects \ FULL \控制面板\ 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");
    }
}

您确定没有在其他地方看到此问题吗?那这个链接呢?stackoverflow.com/questions/3600175/...
AndreCruz

4
不,他们不一样,我可以向您保证,我尝试了在那里完全没有结果的解决方案,他们的错误是:手动删除/更新数据库,而我的则是:考虑使用Code First Migrations更新数据库
a7madx7 2014年

Answers:


139

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

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

我可以通过删除__MigrationHistory表中创建的记录来解决此问题(那里只有一条记录),我假设EF决定我需要使用迁移工具来更新数据库-但我已经亲自完成了此操作。


1
数据库也是如此,这也修复了它。唯一的记录是初始创建,该创建首先发生了代码,但是在首先使用数据库并更改了MS SQL Server中的表之后,我对其进行了修改。
SolidSnake4444

工作了。添加脚手架视图时出现错误。该视图的数据上下文类ApplicationDbContext
Vincent Saelzler,2016年

78

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

DELETE FROM [dbo].[__MigrationHistory]

1
也为我工作。非常奇怪的修复。我认为,历史上的移民中断。我将尝试删除所有迁移,然后再次创建初始迁移。
哈坎

1
@Dave Voyles,您可以直接在SSMS中运行此SQL
Daniel de Zwaan 2015年

1
也为我工作。在一个数据库中存在此表,而在另一个数据库中存在该表
Tejas

1
由于我的代码在上次更新模型之前运行良好,因此上述答案无济于事。您的回答就成功了。干杯!
锡胡

3
这对我来说不起作用,并导致我需要删除数据库,重新运行迁移并重新添加数据。谨防。
adamonstack

35

这篇文章解决了我的问题。这是所有关于添加以下行Application_Start()Global.asax

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

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


4
我不希望我的数据被损坏或丢失。
赛义德·拉鲁拉·阿勒姆2014年

主席先生,这不是最好的方法。解决方案但不可靠
Ahsan Aftab


12

这是一个奇怪的错误,最后不是我的错误,是Microsoft的错误,当我升级到稳定版时,我将Entity Framework安装为“预发行”版本,并且是导致此错误的原因放开它,不满,谢谢大家,当我问这个问题时,我相信了一周左右,一直在寻找它的解决方案,所以我很确定这个问题不在其他地方:导致该问题的Entity Framework.dll版本如果有帮助,问题是6.0.2。


12

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

长话短说:

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


是的,这就是我的情况,大多数项目使用ef6.1.3,而新创建的测试项目使用ef6.0。
ZZZ

7

我花了很多天解决这个问题,分析了许多不同的帖子,尝试了许多选择,最后解决了。 我的解决方案中的这2个项目是使用EF代码优先迁移的:

  • 控制台应用程序“ DataModel”,主要用作程序集,其中包含我的所有代码优先实体,DbContext,Migration和通用存储库。我已经在该项目中包括了单独的空本地数据库文件(位于DataModel / App_Data文件夹中),以便能够从Package Manager控制台生成迁移。
  • WebApi,它引用DataModel项目并使用WebApi / App_Data文件夹中的本地数据库文件,该文件不包含在项目中

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

我的环境:

  • Windows 8.1 x64
  • 带有Update 1的Visual Studio 2015 Professional
  • 我所有针对.NET Framework 4.6.1的项目
  • NuGet的EntityFramework 6.1.3

在这里,我收集了您应注意的所有备注以及必须满足的所有条件/要求,以避免出现上述例外情况:

  1. 解决方案中的所有项目都应仅使用EntityFramework Nuget软件包的一个版本。
  2. 通过依次运行所有迁移脚本创建的数据库应具有与目标数据库相同的结构/架构,并与实体模型相对应。以下三件事必须彼此完全对应/反射/匹配:
    • 最后的所有迁移脚本
    • 当前代码优先实体模型状态(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. 在使用Package Manager Console之前,请确保使用正确的数据库进行更新或生成迁移,并且将所需项目设置为解决方案的启动项目。为了连接数据库,它将使用该.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. 通过启动项目(将在上面执行行)来重新创建数据库,或使用Package Manager Console的“ update-database”命令。
    4. 手动检查生成的db和__MirgationHistory是否对应于最新的迁移脚本。

3

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

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

add-migration myMirgrationName

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

update-database

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


这绝对是我在这里看到的最佳答案。我认为删除迁移历史记录的建议是一个非常糟糕的主意!
mgrenier

谢谢你的评论。我通常也不建议删除迁移历史记录,但是在特定情况下,以前的迁移点并没有太大不同-即OP并未对模型进行太多修改-因此,我认为可能只需要一步即可,只需删除最后的迁移记录。
Mohamed Nagieb '18

2

我遇到了与a7madx7相同的问题,但是稳定地发布了EF(v6.1.1),并在以下位置找到了解决方法:

已创建http://cybarlab.com/context-has-changed-since-the-database-

带有以下变化:http : //patrickdesjardins.com/blog/the-model-backing-the-context-has-changed-since-the-database-was-created-ef4-3

第二个链接包括对VB的具体提及..... “您可以像这样在global.asax文件中的app_start方法上简单添加所有出现此问题的数据库上下文”

Database.SetInitializer(Of DatabaseContext)(Nothing)

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

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


2

只需在数据库的_MigrationHistory中删除迁移历史记录即可。对我有用



1

删除所有表标识

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

1

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

Enable-Migrations Add-Migration初始化更新数据库运行该应用程序。 解决问题的方法从这里开始


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”上下文的模型已更改。考虑使用“代码优先迁移”来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

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

Database.SetInitializer(null);

这解决了问题


0

简单地讲,错误意味着您的模型已更改并且未与DB同步,因此请转到程序包管理器控制台, add-migration foo2 这将提示造成问题的原因,可能是您删除了某些内容,或者我删除了数据注释。从那里您可以获得更改,并希望在模型中将其逆转。

之后删除foo2。


0

我知道我来晚了,但我也想贡献自己的力量。此错误确实很奇怪,因为浏览器无法理解应如何呈现更改,因为类及其属性可能已更改,但未提交给数据库。

所以做一件事

使用以下命令在Package Manager控制台(工具> NuGet Package Manager> Package Manager控制台)中创建一个迁移:

添加迁移UpdateMigration

其中UpdateMigration是您的迁移的名称。您可以选择任何名称,但请注明。

之后,我们只需要更新数据库,所以运行此命令:

更新数据库

现在,您已将更改提交到数据库,只需刷新浏览器,即可开始!

希望这可以帮助。


0

这是因为您向模型之一添加了一些属性,而您没有update-Database。为了解决这个问题,您必须将其从模型中删除,或者必须add-migration anyProperName 使用该属性和Update-database


0

当我对模型进行更改并且未进行更改迁移以更新数据库时,发生了此错误。

如果您曾经在Code First Migration Schema中对模型进行过更改

别忘了添加迁移

add-migration UpdatesToModelProperites 

上面的命令将读取您在模型中所做的所有更改,并将其写入Up()和Down()方法中。

然后只需使用以下命令更新数据库。

update-database

这对我有用。


-2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.