6

今天是一个悲伤的一天。今天我首先看到了EF异常,说“自从创建数据库以来,支持'DomainContext'上下文的模型已经改变了。”“。这是接近午夜,我仍然看到这个错误。这是我职业生涯的终点 - (实体框架创建空迁移,但坚持我的模型是不同的

我敢肯定没有在模式发生了变化,没有出现错误我试图创建一个新的迁移,就出来了空:

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

应用这种迁移并没有任何好处 - 错误坚持我用共同建议设置初始化剂为空:。

Database.SetInitializer<DomainContext>(null); 

,这让错误消失,当我访问数据库,但这些问题影响我非常多 - 每当我尝试通过代码运行迁移时,我都会看到simil再次AR错误:

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 

运行良好,不给任何问题。但是,当我设置DB初始化器自动运行迁移:

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-initaliser)?

+0

你为什么不尝试一个虚拟的变化?假设要在表中添加一个字段,并且看看EF在请求创建迁移时做了什么,当然以后要删除该字段。 –

+0

试过 - 在移民中只增加了那个领域,没有其他的东西。我目前正在通过EF代码,我想我找到了错误的原因。一旦我修复它,我会发布一篇博客文章。可以对其他人有用。 – trailmax

+1

@Guillelon发现问题 - 这是属性[AllowHtml]应用于模型的一个属性。 – trailmax

回答

6

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

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

我已经写了关于如何调试这种问题的博客帖子:http://tech.trailmax.info/2014/03/inside_of_ef_migrations/

而且我觉得这[AllowHtml]属性是一个错误,我将创建一个可重复的解决方案,将提交错误报告EF-人。

更新:我实际上不能再现错误。类属性上的[AllowHtml]属性与它无关。这是一个神奇的故障。

+0

只是好奇,如果你发布这个信息与EF的人,如果是的话,他们的反馈是什么。 – Kixoka

+0

@Kevin我实际上无法在空白解决方案上重新创建相同的问题。所以没有报告任何地方 – trailmax

+0

这似乎是在https://entityframework.codeplex.com/workitem/2167;评论提到应用空迁移来更新模型状态,该状态在6.1中添加。并且不存在于以前的版本中。 – Patrick

0

今天我有同样的问题。 我在问题出现之前添加了ViewModel,View和Html.EnableClientValidation()

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

然后我重新启动Visual Studio,一切都重新开始。 这一定是一个小故障