无法更新数据库以匹配当前模型,因为存在未决更改

Ahm*_*aba 10 asp.net-mvc entity-framework ef-code-first

我有一个在 Visual Studio 2013 环境中构建的项目,其中 Db 首先使用 EF 5 代码构建。我的 API 已经运行良好很长时间了,但突然间我开始收到以下错误消息:

无法更新数据库以匹配当前模型,因为存在未决更改且自动迁移已禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。

当我尝试到达 API 的终点时。我尝试添加一个新的迁移,然后更新数据库,但仍然出现错误。然后我删除整个数据库并使用 EF 重新创建。我的 API 的端点开始正常工作,但随后我又开始在网页上收到此错误。我在配置文件中将自动迁移设置为 true。我真的不知道为什么这一次又一次地发生。这让我真的很沮丧。这是错误的完整堆栈跟踪:

[AutomaticMigrationsDisabledException:无法更新数据库以匹配当前模型,因为存在挂起的更改并且自动迁移被禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。]
System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) +579 System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) +445
System.Data.Entity.Migrations.<>c__DisplayClassc.b__b() +13
System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) +422
System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) +78
System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update() +12 YourTimeSite.Global.ApplyDatabaseMigrations() in c:\Users\Ahmed\Desktop \YourTimeSite\YourTimeSite\Global.asax.cs:55
YourTimeSite.Global.Application_Start(Object sender, EventArgs e) in c:\Users\Ahmed\Desktop\YourTimeSite\YourTimeSite\Global.asax.cs:32

[HttpException (0x80004005): 无法更新数据库以匹配当前模型,因为存在挂起的更改并且禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +9966013
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[]
系统处理程序) +1 .Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +172
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +352
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +296

[HttpException (0x80004005): 无法更新数据库以匹配当前模型,因为存在挂起的更改并且禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9947380 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101

Jam*_*mie 9

我在这方面遇到了很多麻烦,但对我来说,答案是排除中间数据库迁移项目,这些项目更改了已经通过这些更改创建的表。如果我对我在这里所做的事情有更多的了解,我想我会遵循上面关于 DbContext 设置的建议。

运行 update-database 产生了相同的错误,但是:

  • 添加一个空迁移(通过 PM)然后 update_database 工作

add-migration EmptyMigration

然后运行

update-database
Run Code Online (Sandbox Code Playgroud)

此时迁移运行没有错误。

  • 也就是说,一些迁移​​需要从项目中排除(不了解 CodeFirst 项目是如何创建这些迁移的,因此它们是不需要的,因此可以“排除”)。
  • 项目迁移包括更新 EntityFramework 已经应用的表结构的中间步骤(实体框架新手 - 我正在 - 使用来自 udemy - MVC5 课程的 CodeFirst 示例)
  • 什么开始是“无法为...创建显式迁移”(VS2019)
  • 然后“没有未决的显式迁移。解码时发现无效数据。”
  • 按照说明删除 obj 文件夹,然后从 Nuget 清除缓存,没有任何结果。

  • 接下来,尝试使用 SSMS 使用空数据库(我正在运行 SQL Server 的开发人员版本,但 Express 将是相同的)删除并重新创建数据库。这部分可能需要也可能不需要。

  • 启动项目并注意到它是 Net Framework 4.5,因此更新到 4.7。再次,不确定是否需要它。示例项目是为 Community Edition 2013 构建的。

  • 重启项目(VS2019)

  • 执行了上述两个步骤,现在一切正常。


Chr*_*att 3

这里确实不足以诊断问题的根本原因,但通常,只有当数据库以某种方式与实体类不同步时,您才会收到该错误。如果您确实认为不是这样,您可以通过_MigrationHistory从生产数据库中删除该表来阻止此异常的发生。此时,EF 会将数据库视为现有数据库,并且不再提示您迁移它。相反,只有当它发现意外/丢失的列或由于架构不同步而导致的其他 SQL 错误时,您才会收到异常。在某些方面,这更好,就好像确实有什么问题一样,您将更好地了解到底是什么问题,而不是被广泛告知您需要迁移。

但是,删除迁移历史表意味着如果您确实对实体类进行了更改,您将负责保持其同步。一般来说,无论如何,这都不是问题。无论如何,针对生产数据库运行迁移并不是一个好主意,因此这实际上迫使您在必要时显式更新架构,希望使用正确的更改管理策略。