Entity framework 实体框架:添加迁移失败,无法更新数据库

Entity framework 实体框架:添加迁移失败,无法更新数据库,entity-framework,Entity Framework,我已经在一个项目(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 migra

我已经在一个项目(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.
我不知道这是否提供了任何线索,但“无法…”文本显示为红色

我已尝试启用自动迁移(这毫无意义,因为我正在尝试将挂起的模型更改写入基于代码的迁移),这会导致数据库中出现所需的迁移。但是,这不是我想要的,因为我在项目中没有迁移

我已尝试删除该数据库并重新创建该数据库。该数据库已重新创建(直到上次迁移),但当我尝试使用添加迁移时,仍会出现“无法更新…”错误

编辑

我尝试了-force参数,但没有任何区别

我的配置类的内容(在上一次迁移后我没有更改任何内容):

编辑2 当我在DbContext中注释以下行时,我发现我能够进行添加迁移:

//Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
//Database.SetInitializer(新的MigrateDatabaseToLatestVersion());
当我将上面的行保留为活动状态并注释掉配置文件中的所有内容时,它仍然无法工作。
为什么Database.SetInitializer行会导致这种奇怪的行为?

从不使用自动迁移,这在过去给我带来了问题(向下迁移数据库时,请从一开始就使用正确的方法!)

此行应位于您的global.asax中:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
上面是我用于多层应用程序的addmigration命令

数据库更新也是如此

Update-Database -ConfigurationTypeName "SlaveConfiguration" -StartupProjectName "FacturatieMVCv2.Data" -Verbose -script

您可以重置实体框架来解决您的问题[但请记住,它将使迁移进入默认状态]

注意:在执行以下操作之前进行备份

您需要删除当前状态:

  • 删除项目中的“迁移”文件夹
  • 删除数据库中的_MigrationHistory表(可能位于系统表下)
您将在数据库[在App_数据文件夹下]中找到u MigrationHistory表

然后在Package Manager控制台中运行以下命令:

Enable-Migrations -EnableAutomaticMigrations -Force
使用带或不带-启用自动迁移

最后,您可以运行:

Add-Migration Initial

在我的例子中,我遇到了相同的错误,因为在迁移过程中,我在构造函数方法的DbContext类上强制执行ObjectContext.CommandTimeout

尝试删除它

((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 5000;
这对我很有用:

update-database -targetmigration:"0" -force -verbose
add-migration Initial
update-database

你能发布你的迁移配置文件吗?你试过-force参数了吗?我也遇到了同样的问题,swapneel下面的回答对我来说很有用,虽然有点极端。幸运的是,我正处于开始阶段,所以这不是一个太大的交易。这很奇怪,但这也发生在我身上。你救了我一天,先生,你可能会发现这一点ed回答帮助:有时你需要第二次迁移,或者你需要禁用在
初始
迁移中生成的代码。这里的关键是让数据库的元数据与初始迁移保持一致,然后再从那里开始。答案应该是答案。我显然太新了,无法理解解决方案。这是第二篇文章建议使用“添加迁移”,但…我在哪里键入此命令?您可以在Visual Studio的“包管理器控制台”中键入。请参阅命令列表:
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 5000;
update-database -targetmigration:"0" -force -verbose
add-migration Initial
update-database