实体框架:添加迁移失败,无法更新数据库
Posted
技术标签:
【中文标题】实体框架:添加迁移失败,无法更新数据库【英文标题】:Entity Framework: Add-Migration fails with Unable to update database 【发布时间】:2013-04-02 13:22:23 【问题描述】:我在一个项目(VS2012 Express 中的 ASP.NET MVC)中使用 Entity Framework (5.0) 已经有一段时间了。不过,现在我无法再添加迁移。
PM > Add-Migration -projectName MyProject.DAL TestMigration
Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration.
我不知道这是否提供任何线索,但“无法...”文本显示为红色。
我尝试启用自动迁移(这没有任何意义,因为我试图将挂起的模型更改写入基于代码的迁移),这会导致在数据库中进行所需的迁移。然而,这不是我想要的,因为我在项目中没有迁移。
我已尝试删除数据库并重新创建数据库。重新创建了数据库(直到上一次迁移),但是当我尝试使用 Add-Migration 时,我仍然收到“无法更新..”错误。
编辑
我尝试了 -force 参数但没有任何区别。
我的配置类的内容(上次迁移后我没有改变任何东西):
public Configuration()
AutomaticMigrationsEnabled = false;
protected override void Seed(Bekosense.DAL.Context.BekosenseContext context)
context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageDrop);
context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageCreate);
context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageSentDrop);
context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageSentCreate);
context.Database.ExecuteSqlCommand(Properties.Resources.AddDbUsers);
编辑 2 当我在我的 DbContext 中注释以下行时,我发现我能够进行添加迁移:
//Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
当我让上面的行保持活动状态并注释掉配置文件中的所有内容时,它仍然无法正常工作。 为什么 Database.SetInitializer 行会导致这种奇怪的行为?
【问题讨论】:
您能否发布您的配置文件以进行迁移? 你试过-force参数了吗? 我遇到了同样的问题,下面的 swapneel 的回答对我有用,尽管它有点极端。幸运的是我还处于起步阶段,所以没什么大不了的 【参考方案1】:从不使用自动迁移,这在过去给我带来了问题(向下迁移数据库时,从一开始就使用正确的方法!)
这一行应该在你的 global.asax 中:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
而不是在您的 DbContext 中!
如果上述方法没有帮助的其他提示:
也许您的应用程序中有多个层:
Add-Migration 000 -StartupProjectName "NameOfTheProjectInSolutionExplorer" -ConfigurationTypeName "MyConfiguration" -ConnectionString "theconnectionstring;" -ConnectionProviderName "System.Data.SqlClient" -Verbose
上面是我用于多层应用程序的 Add-Migration 命令。
数据库更新也是如此
Update-Database -ConfigurationTypeName "SlaveConfiguration" -StartupProjectName "FacturatieMVCv2.Data" -Verbose -script
【讨论】:
【参考方案2】:您可以重置实体框架来解决您的问题[但请记住,它会将迁移带入默认状态]
注意:在执行以下操作之前进行备份
你需要删除当前状态:
删除项目中的迁移文件夹 删除数据库中的 __MigrationHistory 表(可能在系统表下)您会在您的数据库中找到 __MigrationHistory 表 [在 App_Data 文件夹下]
然后在包管理器控制台中运行以下命令:
Enable-Migrations -EnableAutomaticMigrations -Force
使用或不使用 -EnableAutomaticMigrations
最后,您可以运行:
Add-Migration Initial
This may also help you
【讨论】:
您可能会发现此相关答案很有帮助:***.com/a/17798015/97964 有时您需要进行第二次迁移,或者您需要禁用在Initial
迁移中生成的代码。这里的关键是按照初始迁移的顺序获取数据库的元数据,然后从那里开始。
应该是答案。【参考方案3】:
在我的情况下,我遇到了同样的错误,因为我在迁移期间在构造函数方法中强制 ObjectContext.CommandTimeout 对类 DbContext。
尝试删除它
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 5000;
【讨论】:
这很奇怪,但这也发生在我身上。 你救了我的一天,先生【参考方案4】:这对我有用:
update-database -targetmigration:"0" -force -verbose
add-migration Initial
update-database
【讨论】:
我对 EF 来说显然太陌生了,无法理解解决方案。这是建议使用“添加迁移”的第二篇文章,但是......我在哪里输入这个? 您在 Visual Studio 的“包管理器控制台”中执行此操作。查看命令列表:coding.abel.nu/2012/03/ef-migrations-command-reference以上是关于实体框架:添加迁移失败,无法更新数据库的主要内容,如果未能解决你的问题,请参考以下文章
在 WCF 数据服务应用程序中迁移实体框架 6 和 VS2013 后无法更新或删除