自从创build数据库以来,支持“ApplicationDbContext”上下文的模型已经发生了变化

首先我还没有看到这个错误,我猜这不是一个复制品,所以请先阅读整个情况

每一件事情都工作得很好,然后我试图更新我的模型类应用程序类和更新现在左注释),我将在下面列出和繁荣,我有这个丑陋的错误。


自从创build数据库以来,支持“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__DisplayClassf 1.b_ e()at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action )System.Data.Entity.Internal.LazyInternalContext.b中的System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()System.Data.Entity.Internal.RetryAction中的System.Data.Entity.Internal.PerformDatabaseInitialization()上的System.Data.Entity.Internal 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(ActiontypesentityType)在System.Data System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action 1操作) .Inntity.Internal.Linq.InternalSet 1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet 1.Include(String path)在System.Data.Entity.Infrastructure.DbQuery 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable 在Microsoft.AspNet.Identity.EntityFramework.UserStore 6.GetUserAggregateAsync(Expression 1filter)在System.Data.Entity.QueryableExtensions.Include [T,TProperty](IQueryable 1 source, Expression 1path) Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager 2.FindByNameAsync(String userName)at Microsoft.AspNet.Identity.UserManager`2.d_ 12.MoveNext() – – 从以前的位置抛出exception的堆栈跟踪结束—在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在ControlPanel.Web.Controllers。在d:\ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs中的AccountController.d _2.MoveNext():第56行

起初我认为这可能是一个迁移问题,所以我完全丢弃了数据库,我重新启用了迁移,添加了一个Init迁移并更新了数据库

 update-database -force -verbose 

每一件事情都顺利没有投诉,但是每当我尝试login到我的网站我得到以前的错误,我做了十次左右的迁移事情,而无法解决问题..

这里是我的领域类(模型):

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

以防万一谁绊倒这是做像我这样的数据库第一次执行。

我通过扩展ApplicationUser类,添加一个新的字段到AspNetUsers表,然后在启动时出现这个错误。

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

这对我有用 – 不需要其他更改。

 DELETE FROM [dbo].[__MigrationHistory] 

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

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

但是,它会导致数据库重新创build模型中的每个编辑,你可能会丢失你的数据。

每个人都从这个错误中感到头痛: 确保所有的projetcs都有一个对同一个entity framework程序集的引用。

短篇小说长:

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

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

我花了很多天的时间来解决这个问题,分析了很多不同的post,并尝试了很多select, 最后修复。 这2个项目在我的解决scheme中使用EF代码第一次迁移:

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

我得到这个错误,当请求WebApi …

我的环境:

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

在这里,我收集了您应该注意的所有言论和必须满足的所有条件/要求,以避免提到的exception情况:

  1. 您应该只对解决scheme中的所有项目使用一个版本的EntityFramework Nuget包。
  2. 通过按顺序运行所有迁移脚本创build的数据库应该与您的目标数据库具有相同的结构/模式,并与实体模型相对应。 以下三件事情必须完全相符/反映/匹配:
    • 您的所有迁移脚本持续到最后
    • 当前代码第一个实体模型状态(DbContext,entities)
    • 目标数据库
  3. 目标数据库(mdf文件)应该更新/对应到上一个迁移脚本。 validation目标数据库中的“__MigrationHistory”表是否包含您拥有的所有迁移脚本的logging,这意味着所有迁移脚本已成功应用于该数据库。 我build议您使用Visual Studio生成正确的代码第一个实体和上下文,对应于您的数据库,项目 – >添加新项目 – > ADO.NET实体数据模型 – >代码优先从数据库: 当然,作为替代scheme,如果您没有数据库,则可以手动编写模型(代码优先实体和上下文),然后生成初始迁移和数据库。
  4. 连接string的名称例如启动项目的configuration文件(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. 在使用软件包pipe理器控制台之前,请确保您使用正确的数据库进行更新或生成迁移,并将需要的项目设置为解决scheme的启动项目。 对于连接到数据库,它将使用该项目中的.config文件的连接string,该项目被设置为启动项目。
  6. 和主,这解决了我的问题:这是奇怪的,但在我的WebApi / bin文件夹DataModel.exe是旧的,没有刷新自上一次build立。 由于迁移embedded我的程序集DataModel.exe然后我的WebApi使用旧的镜像更新数据库。 我很困惑,为什么在WebApi中更新数据库后,它不对应于DataModel的最新迁移脚本。 以下代码自动创build(如果不存在)或更新到我的WebApi / App_Data文件夹中的最新迁移本地数据库。

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

    我试图干净和重build解决scheme,但它并没有帮助,比我完全从WebApi中删除bin和obj文件夹,从WebApi / App_Data删除数据库文件,内置,重新启动WebApi,请求它,它创build正确的数据库 – 懒惰初始化上面的行),对应于最新的迁移和exception没有出现更多。 所以,这可能会解决您的问题:

    1. 从你的启动项目 (它生成/更新你的数据库) 手动删除bin,obj文件夹
    2. build立你的启动项目,或更好地清理和重build你的解决scheme。
    3. 通过启动项目重新创build数据库(将执行上面的行)或使用软件包pipe理器控制台“update-database”命令。
    4. 手动检查生成的db和__MirgationHistory是否对应最新的迁移脚本。

从你的“数据库>系统表”中删除“[__MigrationHistory]”表将会正常工作。

我和a7madx7有同样的问题,但EF(v6.1.1)稳定版本,发现解决scheme张贴在:

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 ….. “你可以简单地在你的app_start方法在这样的global.asax文件中添加这个问题的所有数据库上下文”

 Database.SetInitializer(Of DatabaseContext)(Nothing) 

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

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

删除所有表格标识

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

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

删除现有的数据库,创build具有相同名称的新数据库,复制所有数据…它将工作