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

How to completely reset all Entity Framework 6 migration history? (Zombie migrations!)

短版:

删除整个数据库(包括 __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();
    }
}

在几台 PC 上它工作正常,但在一台 PC 上,我遇到了一些问题,它似乎在某些方面不同步。每当应用程序 运行s 时,它都会抱怨有待处理的更改。

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: 

但是 运行ning add-migration 显示没有任何变化,update-database 什么也不做。

所以,暂时放弃,我想 "reset" 完全迁移 EF。所以我删除了整个数据库(显然包括 __MigrationHistory table)。我从 IDE 迁移文件夹中删除了所有迁移。

现在...当我在这台新 PC 上启动我们的应用程序时...DbMigrator 仍然从某个地方找到并应用一堆命名迁移!它不是我们目前拥有的完整列表(在我们的源代码管理中),但它是几周前某个时间点的列表。在应用其中一些 "zombie migrations" 之后,它会抛出相同的旧异常“

他们到底是从哪里来的??

我觉得我一定是在做一些非常愚蠢的事情,或者 PC 从根本上搞砸了...

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" }
        );
    }
}

根据评论链和您似乎已经尝试过的内容,我建议采取以下行动。请注意,我假设您有某种形式的代码存储(如果没有,请备份您的代码)。

  1. 删除有问题的数据库。
  2. 关闭 Visual Studio 的所有副本。
  3. 从您的解决方案文件夹中删除源代码(全部,不留下任何内容)。
  4. 从您的代码存储中提取代码副本(拉取、获取等)
  5. 重建解决方案
  6. 运行 update-database 命令和 运行 您的项目。

如果这不能解决您的项目,那么我的猜测是 Visual Studio 安装有问题(重新安装,我希望不会)。

祝你好运。