10

我在一个项目(VS2012 Express 中的 ASP.NET MVC)中使用实体框架(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 行会导致这种奇怪的行为?

4

4 回答 4

22

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

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

您需要删除当前状态:

  • 删除项目中的迁移文件夹
  • 删除数据库中的 __MigrationHistory 表(可能在系统表下)

您将在数据库中找到 __MigrationHistory 表 [在 App_Data 文件夹下]

然后在包管理器控制台中运行以下命令:

Enable-Migrations -EnableAutomaticMigrations -Force

使用或不使用 -EnableAutomaticMigrations

最后,您可以运行:

Add-Migration Initial

这也可能对您有所帮助

于 2013-06-06T13:03:30.157 回答
4

Never use automigrations, that gave me problems in the past (when migrating the database down, use the correct way to do it from the start!)

This line should be in your global.asax:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());

And not in your DbContext!

Other tips if the above won't help:

Perhaps you have multiple layers in your application:

Add-Migration 000  -StartupProjectName "NameOfTheProjectInSolutionExplorer" -ConfigurationTypeName "MyConfiguration"  -ConnectionString "theconnectionstring;" -ConnectionProviderName "System.Data.SqlClient" -Verbose

Above is the Add-Migration command i use for a multi-layered application.

Same thing for an update of the database

Update-Database -ConfigurationTypeName "SlaveConfiguration" -StartupProjectName "FacturatieMVCv2.Data" -Verbose -script
于 2013-05-30T08:57:19.273 回答
4

在我的情况下,我遇到了同样的错误,因为我在迁移期间在构造函数方法的类 DbContext 上强制 ObjectContext.CommandTimeout。

尝试删除它

((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 5000;
于 2013-10-14T18:48:23.573 回答
4

这对我有用:

update-database -targetmigration:"0" -force -verbose
add-migration Initial
update-database
于 2014-06-09T07:54:17.583 回答