自创建数据库以来,支持“ApplicationDbContext”上下文的模型已更改
Posted
技术标签:
【中文标题】自创建数据库以来,支持“ApplicationDbContext”上下文的模型已更改【英文标题】:The model backing the 'ApplicationDbContext' context has changed since the database was created 【发布时间】:2014-04-19 22:58:29 【问题描述】:首先,我在其他任何地方都没有看到过这个错误,我猜它不是重复的,所以请先阅读整个情况。
一切正常,然后我尝试更新我的一个模型类(App 类,更新现在留下评论)我将在下面列出;并且繁荣我有这个丑陋的错误。
支持“ApplicationDbContext”上下文的模型在创建数据库后发生了变化。考虑使用 Code First 迁移来更新数据库 (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() 在 System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) 在 System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() 在 System.Data .Entity.Internal.LazyInternalContext.b__4(InternalContext c) at System.Data.Entity.Internal.RetryAction1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action
1 action) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() at System.Data.Entity.Internal .InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet
1.Include(String path) at System.Data.Entity.Infrastructure.DbQuery1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable
1 source, String path) at System.Data.Entity.QueryableExtensions.Include[T,TProperty](IQueryable1 source, Expression
1 路径) 在 Microsoft.AspNet.Identity.EntityFramework.UserStore6.GetUserAggregateAsync(Expression
1 过滤器) 在 Microsoft.AspNet.Identity.EntityFramework.UserStore@987654329 @2.FindByNameAsync(String userName) 在 Microsoft.AspNet.Identity.User Manager`2.d__12.MoveNext() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification 的 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) (任务任务)在 ControlPanel.Web.Controllers.AccountController.d__2.MoveNext() 在 d:\Projects\FULL\Control Panel\ControlPanel.Web\Controllers\AccountController.cs:line 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;
这是我的身份模型:
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");
【问题讨论】:
你确定你没有在其他地方看到过这个问题吗?这个链接呢? ***.com/questions/3600175/… 不,它们不一样我可以向你保证,我已经尝试了那里提供的解决方案,但根本没有结果,他们的错误是:要么手动删除/更新数据库,而我的说:考虑使用代码优先迁移来更新数据库 【参考方案1】:以防万一其他人偶然发现这是像我一样进行数据库优先实现的人。
我通过扩展ApplicationUser
类进行了更改,向AspNetUsers
表添加了一个新字段,然后在启动时出现此错误。
我能够通过删除在__MigrationHistory
表中创建的记录来解决这个问题(那里只有一条记录)我假设 EF 决定我需要使用迁移工具更新我的数据库 - 但我已经这样做了我自己手动。
【讨论】:
数据库优先,这修复了它。唯一的记录是最初的创建,它确实首先发生了代码,但我在首先使用数据库并更改 MS SQL 服务器中的表后对其进行了修改。 工作。添加脚手架视图时出现错误。视图的数据上下文类是ApplicationDbContext
【参考方案2】:
这对我有用 - 无需其他更改。
DELETE FROM [dbo].[__MigrationHistory]
【讨论】:
也为我工作。非常奇怪的修复。我认为,历史上曾有过一次破碎的迁徙。我将尝试删除所有迁移并重新创建初始迁移。 @Dave Voyles 你可以直接在 SSMS 中运行这个 SQL 也为我工作。在一个数据库中,该表存在,而在另一个数据库中却存在 以上答案对我没有帮助,因为我的代码在最后一次模型更新之前运行良好。你的回答成功了。干杯男人! 这对我不起作用,导致我需要删除数据库,重新运行迁移并重新添加数据。当心。【参考方案3】:post 解决了我的问题。这就是在Application_Start()
中的Global.asax
中添加以下行:
Database.SetInitializer<Models.YourDbContext>(null);
但是,它会导致模型中的每次编辑都重新创建数据库,并且您可能会丢失数据。
【讨论】:
我不希望我的数据被损坏或丢失。 不是最好的方法,先生。解决方案但不可靠【参考方案4】:如果您从“数据库 > 系统表”中删除“[__MigrationHistory]”表,那么它将起作用。
【讨论】:
它有效。但是在删除[__MigrationHistory]
表之后,也只需更新 EDMX mmodel。【参考方案5】:
这是一个奇怪的错误,最后不是我的错误,是微软的,我安装了“预发布”版本的实体框架,它是造成这个错误的原因,当我升级时到稳定版本,它消失了,谢谢大家相信我,当我问这个问题时,我搜索了一周左右的解决方案,所以我很确定这个问题不在其他任何地方:实体 framework.dll 的版本如果有帮助,导致问题的原因是 6.0.2。
【讨论】:
【参考方案6】:每个人都因这个错误而头疼:绝对确保所有项目都引用同一个实体框架程序集。
长话短说:
我的模型和我的应用程序位于不同的程序集中。这些程序集引用了不同版本的实体框架。我猜这两个版本为同一个模型生成了不同的 id。因此,当我的应用程序运行时,模型的 ID 与 __MigrationHistory 中的最新迁移之一不匹配。更新所有对最新 EF 版本的引用后,该错误再也没有出现过。
【讨论】:
是的,这就是我的情况,大多数项目都是使用 ef6.1.3,而新创建的测试项目不知何故使用的是 ef6.0。【参考方案7】:我花了很多天来解决这个问题,分析了很多不同的帖子,尝试了很多选项,终于解决了。 我的解决方案中的这 2 个项目使用 EF 代码优先迁移:
控制台应用程序“DataModel”主要用作程序集,其中包含我的所有代码优先实体、DbContext、迁移和通用存储库。我已经在这个项目中包含了单独的空本地数据库文件(在 DataModel/App_Data 文件夹中),以便能够从包管理器控制台生成迁移。 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在这里,我收集了您应该注意的所有备注以及必须满足的所有条件/要求,以避免提到的异常:
-
对于解决方案中的所有项目,您应该只使用一个版本的 EntityFramework Nuget 包。
通过顺序运行所有迁移脚本创建的数据库应具有与您的目标数据库相同的结构/架构并对应于实体模型。以下三件事必须完全对应/反映/匹配:
您的所有迁移脚本直到最后
当前代码优先实体模型状态(DbContext、实体)
目标数据库
目标数据库(mdf 文件)应更新/对应于最后一个迁移脚本。验证目标数据库中的“__MigrationHistory”表是否包含您拥有的所有迁移脚本的记录,这意味着所有迁移脚本都已成功应用于该数据库。我建议您使用 Visual Studio 生成与您的数据库相对应的正确代码优先实体和上下文,项目 -> 添加新项目 -> ADO.NET 实体数据模型 -> 数据库中的代码优先:
当然,作为替代方案,如果您没有数据库,您可以手动编写模型(代码优先实体和上下文),然后生成初始迁移和数据库。
连接字符串的名称,例如MyConnectionString 在启动项目(Web.config/App.config)的配置文件中:
<configuration>
<connectionStrings>
<add name="MyConnectionString" connectionString="...">
</connectionStrings>
<configuration>
应该等于你的 DbContext 的构造函数中传递的参数:
public partial class MyDbContext : DbContext
public MyDbContext()
: base("name=MyConnectionString")
...
在使用 Package Manager Console 之前,请确保您使用正确的数据库进行更新或生成迁移,并且需要的项目设置为 解决方案的启动项目。 用于连接到数据库它将使用该 .config 文件中的连接字符串,该文件在项目中设置为启动项目。
修复了我的问题的主要问题:这很奇怪,但在我的 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,向它发出请求,它创建了正确的数据库 - 延迟初始化(使用上面的行),这对应于最新的迁移和异常没有出现更多. 所以,这可能会解决您的问题:
-
从您的启动项目中手动删除 bin、obj 文件夹(生成/更新您的数据库)
构建您的启动项目或更好地清理和重建您的所有解决方案。
通过启动项目(将执行上面的行)或使用包管理器控制台“update-database”命令重新创建数据库。
手动检查生成的db和__MirgationHistory是否对应最新的迁移脚本。
【讨论】:
【参考方案8】:当您更改模型属性的数据注释时,可能会发生这种情况。例如:将 [Required] 添加到属性将导致数据库设计中的未决更改。
最安全的解决方案是在包管理器控制台上运行:
add-migration myMirgrationName
这将显示 Up() 方法中的确切变化。因此,您可以通过以下方式决定是否真的要应用此类更改:
update-database
否则,您可以从 __MigrationHistory 表和解决方案资源管理器的 Migrations 文件夹中删除最新的迁移。
【讨论】:
这绝对是我在这里看到的最好的答案。在我看来,删除迁移历史的建议是一个非常糟糕的主意! 感谢您的评论。我通常也不建议删除迁移历史记录,但在特定情况下,之前的迁移点并没有太大不同 - 即 OP 没有进行太多模型修改 - 所以我认为退一步可能会有所帮助,仅删除最后的迁移记录。【参考方案9】:只需删除数据库中_MigrationHistory 中的迁移历史。它对我有用
【讨论】:
【参考方案10】:我遇到了与 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 方法中简单地添加所有存在此问题的数据库上下文”:
Database.SetInitializer(Of DatabaseContext)(Nothing)
注意:我必须将“DatabaseContext”替换为实现 DbContext 的类的名称
更新:此外,当使用 codefirst 方法连接到现有表时,请检查数据库以查看 EF 是否已创建表“_migrationhistory”来存储映射。我重新命名了这个表,然后能够从 global.asax 中删除 SetInitializer。
【讨论】:
【参考方案11】:我刚刚解决了类似的问题,删除了网站文件夹中的所有文件,然后重新发布。
【讨论】:
【参考方案12】:删除所有表身份
Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser
【讨论】:
【参考方案13】:从工具菜单中,单击 NuGet 包管理器,然后单击包管理器控制台 (PMC)。在 PMC 中输入以下命令。
启用-迁移 添加迁移初始化 更新数据库 运行应用程序。 The solution to the problem is from here
【讨论】:
【参考方案14】:我在开发的时候,更喜欢用这个实用的类来配置Migrations。
希望对你有帮助。
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 ***Initializer());
public class ***Initializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
public ***Initializer()
// 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<***.Models.Company> Companies get; set;
【讨论】:
【参考方案15】:使用旧产品版本删除 [__MigrationHistory] 表中的行对我有用。这个答案适用于那些不想删除整个 [__MigrationHistory] 表的人。只需删除 ProductVersion 列中旧版本的行。希望对大家有所帮助!
【讨论】:
【参考方案16】:以下是我遇到的类似错误
支持“PsnlContext”上下文的模型在创建数据库后发生了变化。考虑使用 Code First 迁移来更新数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)。
我在 Global.asax 的 Application Start 事件中添加了以下部分来解决错误
Database.SetInitializer (null);
这解决了问题
【讨论】:
【参考方案17】:只是
该错误意味着您的模型已更改并且未与 DB 同步,因此
转到包管理器控制台,
add-migration foo2
这将提示导致问题的原因,
可能是您删除了某些内容,或者在我的情况下,我删除了数据注释。
从那里你可以得到改变,并希望在你的模型中扭转它。
之后删除 foo2 。
【讨论】:
【参考方案18】:我知道我来晚了,但我也想贡献一份力量。这个错误真的很奇怪,因为浏览器无法理解应该如何呈现更改,因为类及其属性可能已更改但未提交到数据库。
所以做一件事,
使用以下命令在包管理器控制台(工具 > NuGet 包管理器 > 包管理器控制台)中创建一个迁移:
添加迁移更新迁移
其中 UpdateMigration 是您的迁移的名称。你可以给它任何你选择的名字,但请具体。
之后,我们只需要更新数据库,所以运行这个:
更新数据库
现在您已将更改提交到数据库,只需刷新浏览器即可!
希望这会有所帮助。
【讨论】:
【参考方案19】:这是因为您向其中一个模型添加了一些属性,而您没有 update-Database
。要解决这个问题,您必须将其从模型中删除,或者您必须使用该属性和 Update-database
add-migration anyProperName
。
【讨论】:
【参考方案20】:当我对模型进行更改并且没有进行迁移以更新数据库时,我发生了这个错误。
如果您曾经在 Code First 迁移架构中对模型进行过更改
别忘了添加迁移
add-migration UpdatesToModelProperites
上述命令将读取您在模型中所做的所有更改,并将其写入 Up() 和 Down() 方法中。
然后只需使用以下命令更新您的数据库。
update-database
这对我有用。
【讨论】:
【参考方案21】:删除现有数据库,创建具有相同名称的新数据库,复制所有数据...它会工作
【讨论】:
以上是关于自创建数据库以来,支持“ApplicationDbContext”上下文的模型已更改的主要内容,如果未能解决你的问题,请参考以下文章
自创建数据库以来,支持上下文的模型已更改。考虑使用 Code First 迁移来更新数据库
错误:自创建数据库以来,支持'NameDbContext'上下文的模型已更改