如何完全重置所有Entity Framework 6迁移历史记录?(僵尸迁移!)

7

简短版:

完全删除了整个数据库(包括__MigrationHistory)和解决方案中的所有迁移后……不知何故,迁移命名被找到并由DbMigrator应用!它们是从哪里来的???

详细版:

我们正在使用Entity Framework 6,针对SQL Server 2012。这是一个MVC webapp,我们使用基于代码的迁移,并且在此时我们有相当长的迁移历史记录。我们在启动时运行迁移:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ...

        var configuration = new Configuration();
        var migrator = new DbMigrator(configuration);
        migrator.Update();
    }
}

在几台电脑上它都可以正常运行,但是在一台电脑上,它似乎存在某种不同步的问题。每当应用程序运行时,它会抱怨有待处理的更改。

System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException occurred
HResult=-2146233088
Message=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.
Source=EntityFramework
StackTrace:
     at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
     at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
     at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
     at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
     at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
     at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
     at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
     at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update()
     at CVInsights.MvcApplication.Application_Start() in c:\Work\ClearVision\CVO\CVInsights\Global.asax.cs:line 20
InnerException: 

但运行add-migration没有显示任何更改,而update-database什么也没做。

所以,我暂时放弃了,想要完全“重置”EF迁移。于是我删除了整个数据库(包括__MigrationHistory表),并从IDE迁移文件夹中删除了所有迁移。

现在...当我在这台新电脑上启动我们的应用程序时...DbMigrator仍然会从某个地方找到并应用一堆命名迁移!它不是我们现在拥有的完整列表(在我们的源代码控制中),而是几周前某个时间点之前的列表。在应用了其中一些“僵尸迁移”之后,它抛出了同样的旧异常"

这些东西到底是从哪里来的??

我觉得我一定在做一些非常愚蠢的事情,或者这台电脑基本上是出了问题...

Configuration.cs:

public sealed class Configuration : DbMigrationsConfiguration<CloudDatabase.DAL.DatabaseContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(CloudDatabase.DAL.DatabaseContext context)
    {            

        context.Roles.AddOrUpdate(role => role.ID, // This is the primary key or the table we are adding to or updating.
            new Role() { ID = 1, Name = "A role" },
            new Role() { ID = 2, Name = "another role" },
            new Role() { ID = 3, Name = "third role" }
        );
    }
}

你确定你删除了所有的迁移文件吗(也许有些在不同的文件夹里)?听起来好像它正在应用部分迁移文件,然后尝试将上下文中的其余更改作为自动迁移应用。你是否有一个“基线”数据库,或者你的迁移文件是设计为从空白数据库开始的? - vesan
嗨 Vesan。我认为我删除了所有迁移。我删除了Migrations文件夹中的所有datetime_name.cs文件。没有子文件夹。还有一个configuration.cs,里面没什么东西。迁移从一个空白数据库开始——正如我所说,我删除了整个数据库以重新开始。自动迁移已关闭。(在configuration.cs中自动迁移已禁用;AutomaticMigrationsEnabled = false;) - O'Rooney
嗯,听起来你已经涵盖了几乎所有的东西。你是否使用ildasm/reflector检查了实际运行的dll,以确保它是正确的版本而不是旧版本或其他什么东西?如果没有提供有用的信息,也许你可以尝试迁移日志记录(参见这里)。否则我就没有更多的想法了。希望有人能够帮助你。 - vesan
我已经添加了configuration.cs。 - O'Rooney
你可以尝试查看这个或者这个问题,看看它们是否有帮助。 - vesan
1个回答

5
根据评论链和您似乎尝试过的情况,我建议采取以下行动。请注意,我假设您有某种形式的代码存储(如果没有,请备份您的代码)。
  1. 删除相关数据库。
  2. 关闭所有Visual Studio副本。
  3. 从解决方案文件夹中删除源代码(全部删除,不留任何东西)。
  4. 从代码存储库提取代码(Pull、Get等)。
  5. 重新构建解决方案。
  6. 运行update-database命令并运行项目。
如果这些步骤无法修复您的项目,那么我的猜测是它可能是Visual Studio安装的问题(希望不是)。祝你好运。

1
这似乎解决了问题。迁移历史记录在我的工作文件夹中的“某个地方”,但我不知道在哪里。非常感谢! - O'Rooney
关闭并重新打开解决了我的问题。 - AGoodDisplayName
确认,这解决了我遇到的同样问题。 - Ellis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接