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
我在这方面遇到了很多麻烦,但对我来说,答案是排除中间数据库迁移项目,这些项目更改了已经通过这些更改创建的表。如果我对我在这里所做的事情有更多的了解,我想我会遵循上面关于 DbContext 设置的建议。
运行 update-database 产生了相同的错误,但是:
add-migration EmptyMigration
然后运行
update-database
Run Code Online (Sandbox Code Playgroud)
此时迁移运行没有错误。
按照说明删除 obj 文件夹,然后从 Nuget 清除缓存,没有任何结果。
接下来,尝试使用 SSMS 使用空数据库(我正在运行 SQL Server 的开发人员版本,但 Express 将是相同的)删除并重新创建数据库。这部分可能需要也可能不需要。
启动项目并注意到它是 Net Framework 4.5,因此更新到 4.7。再次,不确定是否需要它。示例项目是为 Community Edition 2013 构建的。
重启项目(VS2019)
这里确实不足以诊断问题的根本原因,但通常,只有当数据库以某种方式与实体类不同步时,您才会收到该错误。如果您确实认为不是这样,您可以通过_MigrationHistory
从生产数据库中删除该表来阻止此异常的发生。此时,EF 会将数据库视为现有数据库,并且不再提示您迁移它。相反,只有当它发现意外/丢失的列或由于架构不同步而导致的其他 SQL 错误时,您才会收到异常。在某些方面,这更好,就好像确实有什么问题一样,您将更好地了解到底是什么问题,而不是被广泛告知您需要迁移。
但是,删除迁移历史表意味着如果您确实对实体类进行了更改,您将负责保持其同步。一般来说,无论如何,这都不是问题。无论如何,针对生产数据库运行迁移并不是一个好主意,因此这实际上迫使您在必要时显式更新架构,希望使用正确的更改管理策略。
归档时间: |
|
查看次数: |
28967 次 |
最近记录: |