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

时间:2014-03-14 15:01:01

标签: .net asp.net-mvc linq entity-framework asp.net-mvc-5

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

每件事情都运转得很好然后我试图更新我的一个模型类 App类,现在更新了评论)我将列出下面和繁荣我有这个丑陋的错误。


  

支持&#39; ApplicationDbContext&#39;自创建数据库以来,上下文已更改。考虑使用Code First Migrations更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。 at System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf 1.b__e()在System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)中的System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()处于System位于System.Data的System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()的.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(Action 1 action) System.Data.Entity.Internal.Linq.InternalSet 1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet中的.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)1.Include(String path)System.Data.Entity.Infrastructure.DbQuery {{1}在System.Data.Entity.QueryableExtensions.Include [T,TProperty](IQueryable 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable 1路径)的Microsoft.AspNet.Identity.EntityFramework.UserStore 1 source, Expression 1过滤器中的1个源,字符串路径)在Microsoft.AspNet.Identity.EntityFramework.UserStore 6.GetUserAggregateAsync(Expression 2.FindByNameAsync(String userName)at Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext()--- stac结束来自抛出异常的先前位置的k跟踪---在ControlPanel.Web.Controllers.AccountController.d__2上的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处.MoveNext()在d:\ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs:第56行

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

更新了数据库
6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager

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

以下是我的域类(模型):

update-database -force -verbose

以下是我的IdentityModels:

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

21 个答案:

答案 0 :(得分:133)

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

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

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

答案 1 :(得分:71)

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

DELETE FROM [dbo].[__MigrationHistory]

答案 2 :(得分:32)

post解决了我的问题。所有这些都是关于在Application_Start()中添加Global.asax中的以下行:

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

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

答案 3 :(得分:11)

每个人都对这个错误感到头疼:绝对确保所有的专业版都引用了相同的Entity Framework程序集。

短篇小说:

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

答案 4 :(得分:11)

如果删除&#34; [__ MigrationHistory]&#34;您的&#34;数据库&gt;中的表格系统表&#34;那就行了。

答案 5 :(得分:11)

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

答案 6 :(得分:7)

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

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

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

我的环境:

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

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

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

    <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是否与最新的迁移脚本相对应。

答案 7 :(得分: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

第二个链接包含对VB的具体提及..... “你可以简单地在global.asax文件中添加所有在app_start方法上遇到此问题的数据库上下文,如”:< / p>

Database.SetInitializer(Of DatabaseContext)(Nothing)

注意:我必须用实现DbContext

的类的名称替换“DatabaseContext”

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

答案 8 :(得分:2)

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

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

add-migration myMirgrationName

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

update-database

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

删除所有表格标识

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

答案 11 :(得分:1)

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

启用的迁移 添加迁移初始化 更新数据库 运行该应用程序。 The solution to the problem is from here

答案 12 :(得分:0)

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

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

别忘了添加迁移

add-migration UpdatesToModelProperites 

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

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

update-database

这对我有用。

答案 13 :(得分:0)

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

做一件事,

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

  

添加迁移UpdateMigration

其中UpdateMigration是您的迁移的名称。您可以选择任意名称,但是请具体说明。

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

  

更新数据库

现在您已将更改提交到数据库,只需刷新浏览器就可以了!

希望这会有所帮助。

答案 14 :(得分:0)

简单地 该错误表示您的模型已更改,并且未与DB同步,因此 转到软件包管理器控制台, add-migration foo2 这将提示导致问题的原因, 可能是您删除了某些内容,或者就我而言,我删除了数据注释。 从那里可以得到更改,并希望在模型中将其逆转。

在删除foo2之后。

答案 15 :(得分:0)

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

答案 16 :(得分:0)

以下是我遇到的类似错误

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

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

Database.SetInitializer (空);

此问题已解决

答案 17 :(得分:0)

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

希望它有所帮助。

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

}

答案 18 :(得分:0)

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

答案 19 :(得分:-1)

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

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

答案 20 :(得分:-1)

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