简短版:
完全删除了整个数据库(包括__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" }
);
}
}