自从创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(Action
typesentityType)在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情况:
- 您应该只对解决scheme中的所有项目使用一个版本的EntityFramework Nuget包。
- 通过按顺序运行所有迁移脚本创build的数据库应该与您的目标数据库具有相同的结构/模式,并与实体模型相对应。 以下三件事情必须完全相符/反映/匹配:
- 您的所有迁移脚本持续到最后
- 当前代码第一个实体模型状态(DbContext,entities)
- 目标数据库
- 目标数据库(mdf文件)应该更新/对应到上一个迁移脚本。 validation目标数据库中的“__MigrationHistory”表是否包含您拥有的所有迁移脚本的logging,这意味着所有迁移脚本已成功应用于该数据库。 我build议您使用Visual Studio生成正确的代码第一个实体和上下文,对应于您的数据库,项目 – >添加新项目 – > ADO.NET实体数据模型 – >代码优先从数据库: 当然,作为替代scheme,如果您没有数据库,则可以手动编写模型(代码优先实体和上下文),然后生成初始迁移和数据库。
-
连接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"){} ...
- 在使用软件包pipe理器控制台之前,请确保您使用正确的数据库进行更新或生成迁移,并将需要的项目设置为解决scheme的启动项目。 对于连接到数据库,它将使用该项目中的.config文件的连接string,该项目被设置为启动项目。
-
和主,这解决了我的问题:这是奇怪的,但在我的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没有出现更多。 所以,这可能会解决您的问题:
- 从你的启动项目 (它生成/更新你的数据库) 手动删除bin,obj文件夹
- build立你的启动项目,或更好地清理和重build你的解决scheme。
- 通过启动项目重新创build数据库(将执行上面的行)或使用软件包pipe理器控制台“update-database”命令。
- 手动检查生成的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具有相同名称的新数据库,复制所有数据…它将工作