7

今天是悲伤的一天。今天第一件事我看到 EF 异常说“自从创建数据库以来,支持 'DomainContext' 上下文的模型已经改变。 ”。现在快午夜了,我仍然看到这个错误。这是我职业生涯的结束-(

我很确定模型中没有任何变化,但出现了错误。我试过创建一个新的迁移,结果是空的:

public void Up()
{
}
public void Down()
{
}

应用此迁移没有任何好处 - 错误仍然存​​在。我使用了常见的建议将初始化程序设置为空:

Database.SetInitializer<DomainContext>(null);

当我访问数据库时,它使错误消失了。但这让我非常困扰 - 每当我尝试通过代码运行迁移时,我都会再次看到类似的错误:

var configuration = new Migrations.Configuration();

configuration.TargetDatabase = new DbConnectionInfo("correct connection string", "System.Data.SqlClient");

var migrator = new DbMigrator(configuration);

migrator.Update(); // <<-- exception is thrown here

异常抛出如下所示:System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException :无法更新数据库以匹配当前模型,因为存在待处理的更改并且禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。

我已经更新到 EF 6.1(之前是 6.0.2),但这并没有什么区别。

让我困扰的另一件事是我可以通过 Nuget 控制台运行迁移:

Update-Database

运行良好,不会出现任何问题。但是当我将数据库初始化程序设置为自动运行迁移时:

var initializer = new MigrateDatabaseToLatestVersion<DomainContext, Migrations.Configuration>();
Database.SetInitializer(initializer);
var domainContext = new DomainContext();
domainContext.Database.Initialize(true); // <<-- this throws exception

无法更新数据库以匹配当前模型,因为存在待处理的更改并且自动迁移已禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。

真正的问题是,为什么 EF 在通过 Nuget 控制台和通过 Migrations DB-Initialiser 运行时对模型有不同的哈希值?如何找出不同之处(来自 db-state 的模型)?以及如何解决这个问题,所以我不必使用黑客(将 null 分配给 db-initaliser)?

4

2 回答 2

6

我的问题的原因是[AllowHtml]应用于其中一个模型的属性。在我将 MVC 更新到 5.1.1 并将 WebApi 更新到 2.1 之后,问题就开始发生了。

我已经从 EF-Model 中删除了该属性,并剥离并重新构建了数据库,问题就消失了。

我写了一篇关于如何调试此类问题的博客文章:http: //tech.trailmax.info/2014/03/inside_of_ef_migrations/

另外我认为这个[AllowHtml]属性是一个错误,我将创建一个可重现的解决方案并将错误报告提交给 EF 人员。

更新:我实际上永远无法重现该错误。[AllowHtml]类属性上的属性与它无关。那是一个神奇的故障。

于 2014-03-28T03:14:36.657 回答
0

我今天遇到了同样的问题。我在问题出现之前添加了一个 ViewModel、一个 View 和 Html.EnableClientValidation()

根本没有模型更改!我做了一个虚拟的改变,就像@Guilleon 建议的那样,并创建了一个有效的迁移......但它没有帮助。

然后我重新启动了 Visual Studio,一切都恢复了。一定是个毛病

于 2016-07-24T13:12:22.563 回答