如何完全重置所有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" }
);
}
}
根据评论链和您似乎已经尝试过的内容,我建议采取以下行动。请注意,我假设您有某种形式的代码存储(如果没有,请备份您的代码)。
- 删除有问题的数据库。
- 关闭 Visual Studio 的所有副本。
- 从您的解决方案文件夹中删除源代码(全部,不留下任何内容)。
- 从您的代码存储中提取代码副本(拉取、获取等)
- 重建解决方案
- 运行
update-database
命令和 运行 您的项目。
如果这不能解决您的项目,那么我的猜测是 Visual Studio 安装有问题(重新安装,我希望不会)。
祝你好运。
短版:
删除整个数据库(包括 __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" }
);
}
}
根据评论链和您似乎已经尝试过的内容,我建议采取以下行动。请注意,我假设您有某种形式的代码存储(如果没有,请备份您的代码)。
- 删除有问题的数据库。
- 关闭 Visual Studio 的所有副本。
- 从您的解决方案文件夹中删除源代码(全部,不留下任何内容)。
- 从您的代码存储中提取代码副本(拉取、获取等)
- 重建解决方案
- 运行
update-database
命令和 运行 您的项目。
如果这不能解决您的项目,那么我的猜测是 Visual Studio 安装有问题(重新安装,我希望不会)。
祝你好运。